пользовательская сериализация xml - PullRequest
4 голосов
/ 24 июня 2010

мне нужна помощь, у меня есть некоторые данные, поступающие в xml, я хочу сделать объект из него, сделать что-то с ним, сериализовать его обратно и отправить его ... но это должна быть какая-то пользовательская сериализация.1001 *

xml как:

<Animals Ver="12" class="1" something="2">
    <Dog Ver="12" class="2" something="17">
        <Name> a </Name>
        <Sound> oof </Sound>
        <SomeOtherProp>12</SomeOtherProp>

    </Dog>
    <Cat Ver="12" class="3" something="4">
       <Name> b </Name>
       <Sound> meow </Sound>
    </Cat>
</Animals>

необходимо представить как:

abstract class Animal :XmlMagic
{
  public string Name{get;set;}
  public string Sound{get;set;}

  public void SomeMagicalXMLSerializationMethod()
  {}
  public void SomeMagicalXMLDeSerializationMethod()
  {}
}

class Dog: Animal, XmlMagic
{
  public int SomeOtherProp{get;set;}
  public void SomeMagicalXMLSerializationMethod()
  {}
  public void SomeMagicalXMLDeSerializationMethod()
  {}
}

Ответы [ 3 ]

7 голосов
/ 24 июня 2010

XmlMagic, который вы ищете, называется IXmlSerializable интерфейсом: http://msdn.microsoft.com/en-us/library/system.xml.serialization.ixmlserializable.aspx

. Он предоставляет вам 2 метода ReadXml и WriteXml, где вы должны реализовать чтение вашего объекта и записьобратно.Затем вы используете стандарт .Net XmlSerializer для сериализации / десериализации ваших объектов.

Дайте мне знать, если вам нужна дополнительная помощь.

4 голосов
/ 24 июня 2010

Однако существуют также атрибуты сериализации XML, такие как

[XmlAttribute]
[XmlArrayElement]
[XmlRoot]

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

0 голосов
/ 24 июня 2010

Возможно, вы захотите проверить стартовый комплект WCF REST;поскольку он включает в себя добавление визуальной студии под названием «Вставить XML как тип»

По сути, вы копируете необработанный XML и затем выбираете эту опцию;и он сгенерирует для вас класс на основе этого XML.Тогда вы можете сделать что-то простое, как:

var xmlResponse = new XmlDocument();
xmlResponse.LoadXml(response);
var deserializedResponse = ConvertNode<ResponseWrapper.response>(xmlresponse); 

public static T ConvertNode<T>(XmlNode node) where T : class
        {
            var stm = new MemoryStream();

            var stw = new StreamWriter(stm);
            stw.Write(node.OuterXml);
            stw.Flush();

            stm.Position = 0;

            var ser = new XmlSerializer(typeof(T));
            var result = (ser.Deserialize(stm) as T);

            return result;
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...