1

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

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

  • ли порядок двойников элементов материи?
  • Должно ли URI пространства имен xml всегда начинаться с http://schemas.datacontract.org/2004/07/?
  • do z: Id и z: значения значения должны быть секвенциальными или что-нибудь еще? (При условии, preserveObjectReferences==true) (ок, я думаю MSDN says this case is not even interoperable)
  • и т.д.

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

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

ответ

0

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

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

  • При создании службы в .net, не используют наборы данных
  • при создании службы в Java не используют векторы
0

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 для дополнительной проверки.

+0

Правильно, вот что я делаю. Но просто взглянув на итоговый результат, я не могу знать ограничения *, которые мне нужно выполнить. Например, я могу видеть '' в XML, но означает ли это, что '' тоже сработало бы? Я перечислил другие примеры в вопросе. –

+0

К сожалению, я изменил работу, поэтому я не могу смотреть на код, который я делал раньше, но помню, что, пока он был хорошо сформирован, он был довольно неприличным. Все, что я предлагаю, это то, что вы берете схемы, которые им нужны, из папки схемы в VisualStudio (C: \ Program Files (x86) \ Microsoft Visual Studio 10.0 \ Xml \ Schemas): – Bronumski

+0

На самом деле схема для пространства имен http: // schemas ,microsoft.com/2003/10/Serialization/Arrays не там, где звонит звонок. Я думаю, что все, что я сделал, это создать ряд модульных тестов для действительно сложных сценариев и убедиться, что они сработали. По мере изменения графика вашего объекта просто обновляйте свои тесты. – Bronumski

Смежные вопросы