2016-02-27 5 views
2

Моя цель - свободно подключать два приложения, используя передачу данных XML.десериализация XML в разные классы?

Я могу легко сериализовать и десериализовать в формате XML. Но могу ли я сериализовать из класса в App1 и десериализовать в другом классе (с той же структурой, что и оригинал) в App2?

C# или VB, не имеет значения. Пример структуры в VB:

App1:

Namespace Transmitter 

    <DataContract> 
    Public Class DataOut 
     <DataMember> 
     Public Header As String 
     <DataMember> 
     Public Content As String 
    End Class 

End Namespace 

App2:

Namespace Receiver 

    <DataContract> 
    Public Class DataIn ' structure actually matches Transmitter.DataOut from App1 
     <DataMember> 
     Public Header As String 
     <DataMember> 
     Public Content As String 
    End Class 

End Namespace 

В App1 я могу сериализовать экземпляр Transmitter.DataOut в XML, но как я могу прочитать полученный XML в App2 в том числе Receiver.DataIn? Должен ли я реализовать Transmitter.DataOut в App2? Или это (я согласен, что много раз полезная) функция будет работать вокруг? Я не хочу, чтобы меня ограничивали, разделяя одно имя класса.

Я заинтересован в практическом использовании («это жизнеспособно?») Не обязательно в исходном коде. Я могу опубликовать свой источник, если это необходимо, но он довольно стандартный, используя DataContractSerializer.

ответ

2

Да, вы можете это сделать. Все, что должно соответствовать, - это контракты данных, а не базовые типы .Net. От Data Contract Equivalence:

Для клиента, чтобы успешно передавать данные определенного типа на услугу или услугу, чтобы успешно передавать данные клиенту, посланный тип не обязательно должен существовать на приемном конце. Единственное требование состоит в том, чтобы контракты данных обоих типов были эквивалентными. (Иногда строгая эквивалентность не требуется, как обсуждалось в Data Contract Versioning.)

Для того чтобы контракты данных были эквивалентными, они должны иметь одинаковое пространство имен и имя. Кроме того, каждый элемент данных с одной стороны должен иметь эквивалентный элемент данных на другой стороне.

Для того чтобы данные были эквивалентными, они должны иметь то же имя. Кроме того, они должны представлять один и тот же тип данных; то есть их контракты на данные должны быть эквивалентными.

Одна из основных сильных сторон сериализатора на основе контрактов заключается в том, что он не требует, чтобы базовые типы были идентичными. Это позволяет реализовать независимость от формата проводов, а также enables communication between completely different architectures - включая, например, Java and .NET.

Вам нужно будет явно установить data contract namespace и name быть одинаковыми в обеих системах, например:

Namespace Transmitter 

    <DataContract(Name:= "Data", [Namespace]:="http://www.MyNameSpace.com")> _ 
    Public Class DataOut 
     <DataMember> 
     Public Header As String 
     <DataMember> 
     Public Content As String 
    End Class 

End Namespace 

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

<Assembly:ContractNamespaceAttribute("http://www.MyNameSpace.com", ClrNamespace:="Transmitter")> 

Подробнее см. Data Contract Names.

Также имейте в виду, что DataContractSerializer является order sensitive, поэтому порядок участников в контрактах должен соответствовать.

+0

Это отличное объяснение. Спасибо, что продемонстрировали, как это можно понять и сделать. (Вчера и сегодня я провел много неудачных часов, изучая и пытаясь.) – miroxlav

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