Как обеспечить взаимодействие с DataContractSerializer при разговоре с приложением, отличным от .NET?

Скажем, у меня есть приложение, отличное от .NET, которому необходимо записывать данные для десериализации с помощью приложения .NET через DataContractSerializer. Где спецификация, описывающая точный необходимый формат?

Такая спецификация должна описывать множество вещей, в том числе:

  • Имеет ли значение порядок элементов-братьев?
  • Должны ли URI пространства имен xml всегда начинаться с http://schemas.datacontract.org/2004/07/?
  • делать z: Id и z: Ref значения должны быть последовательными или что-то в этом роде? (при условии preserveObjectReferences==true) (хорошо, я думаю, MSDN говорит, что этот случай даже не совместим < / а>)
  • и т.д

Кажется, простой вопрос, не так ли? Тем не менее, я не вижу прямого обращения к нему в MSDN. (все, что я нашел, это сообщения на форуме говоря, что приложение, не относящееся к .NET, должно сначала запросить у приложения .NET файл спецификации WSDL. Но это кажется неправильным.)

(Я не использую ничего из WCF, кроме DataContractSerializer)


person Stefan Monov    schedule 22.09.2010    source источник


Ответы (2)


Мы используем WSDL для связи определения службы между приложениями Java и .net, у нас он отлично работает.

Одна вещь, на которую вам нужно обратить внимание, это то, какие типы данных вы используете, используйте те, которые понятны обеим системам, например:

  • Если вы создаете сервис в .net, не используйте наборы данных
  • Если вы создаете сервис на java, не используйте векторы
person Shiraz Bhaiji    schedule 22.09.2010

DataContractSerializer не является частью WCF, это часть сериализации среды выполнения, от которой зависит WCF.

Раньше я использовал DataContractSerializer для десериализации объектов из XML, которые я сгенерировал из преобразования xml. Это может быть связано с тем, чем вы хотите заниматься.

Чтобы выяснить, какой XML требуется для сериализатора, мне было проще написать небольшой фрагмент кода, который сериализует мой объект в строку, чтобы увидеть, как он должен быть структурирован и каковы пространства имен XML.

[TestFixture]
public class TestDataContractSerializerOutput
{
    [Test]
    public void Should_give_me_some_serialized_xml()
    {
        Foo foo = new Foo();
        foo.Bars.Add(new Bar { Name = "Wibble"});
        var dataContractSerializer = new DataContractSerializer(typeof(Foo), new[] { typeof(Bar) } );

        using (Stream stream = new MemoryStream())
        {
            dataContractSerializer.WriteObject(stream, foo);
            stream.Position = 0;

            using (StreamReader streamReader = new StreamReader(stream))
            {
                Trace.WriteLine(streamReader.ReadToEnd());
            }
        }
    }
}

[DataContract]
public class Foo
{
    public Foo()
    {
        Bars = new List<IBar>();
    }

    [DataMember]
    public IList<IBar> Bars { get; set; }
}

public interface IBar
{
    string Name { get; set; }
}

[DataContract]
public class Bar : IBar
{
    public string Name { get; set; }
}

С помощью этой информации вы можете увидеть, как структурировать XML, а также получить XML-схемы для дополнительной проверки.

person Bronumski    schedule 22.09.2010
comment
Верно, вот что я делаю. Но просто взглянув на результат, я не могу понять, какие ограничения мне нужно соблюдать. Например, я могу увидеть <root> <foo/> <bar/> </root> в XML, но означает ли это, что <root> <bar/> <foo/> </root> тоже сработало бы? Я перечислил другие примеры в вопросе. - person Stefan Monov; 22.09.2010
comment
К сожалению, я сменил работу, поэтому я не могу смотреть на код, который делал раньше, но я помню, что до тех пор, пока он был хорошо сформирован, он был достаточно гибким. Все, что я предлагаю, - это взять необходимые схемы из папки схем в VisualStudio (C: \ Program Files (x86) \ Microsoft Visual Studio 10.0 \ Xml \ Schemas): - person Bronumski; 22.09.2010
comment
Фактически схема для пространства имен schemas.microsoft.com/2003/10/Serialization/Arrays сейчас не там, что звонит в колокольчик. Думаю, все, что я сделал, - это создал ряд модульных тестов для действительно сложных сценариев и убедился, что они работают. По мере изменения графа объекта просто обновляйте свои тесты. - person Bronumski; 22.09.2010