Сериализация в C # - PullRequest
       19

Сериализация в C #

0 голосов
/ 18 мая 2010

Моя структура классов выглядит следующим образом.

[Serializable]
[XmlRootAttribute("person", Namespace = "", IsNullable = false)]
public class Person : IDisposable
{
      Private int _id;
      Private string _name;

      [XmlElement(“id”)]
      Public int Id
      {
            Get{ return _id;}
            Set{ _id = value;}
      }

      [XmlElement(“name”)]
      Public string Name
      {
            Get{return _name;}
            Set{_name = value;}
      }
}

Я получаю следующий XML при сериализации вышеуказанного класса

<person> 
 <id>1</id>
  <name>Test</name>
</person>

Теперь я хотел бы сериализовать вышеуказанный класс следующим образом, то есть я хотел бы добавить атрибут «type» для каждого открытого свойства, которое сериализовано как элемент xml. Я могу добавить атрибут «type» к узлу «person», объявив другое общедоступное свойство «type» с помощью «[XmlAttribute (« type »)]» », но я хотел бы добиться того же для каждого открытого свойства, сериализованного как элемент xml. Любая идея для достижения ниже:

<person type=”Person”>
  <id type=”int”>1</id>
  <name type=”string”>Test</name>
</person>

Ответы [ 2 ]

2 голосов
/ 18 мая 2010

Первое, что приходит мне в голову, - это создать универсальный класс с именем, например, Typed<T>, который выглядит следующим образом:

    [Serializable]
    public class Typed<T>
    {
        public Typed()
        {
        }

        public Typed( T value )
        {
             this.Value = value;
        }

        [XmlText]
        public T Value { get; set; }

        [XmlAttribute( "Type" )]
        public String Type
        {
            get
            {
                return typeof( T ).Name;
            }
            set
            {
                // Skipped for clarity
            }
        }
    }

Тогда ваш Public int Id становится Public Typed<int> Id. Возможно, есть и другой способ сделать это, используя суррогаты для парсера xml, но сейчас это на моей голове.

0 голосов
/ 18 мая 2010

Иван отвечает хорошо и очень креативно, но может включать рефакторинг кода, который вы не хотите трогать. Если это так, вы можете рассмотреть возможность реализации IXmlSerializable. Он включает в себя работу непосредственно с XmlWriter и XmlReader, но если вы знаете подводные камни работы с этими классами (особенно XmlReader), это не так уж плохо и дает вам полный контроль над форматом XML.

Если вы хотите получить фантазию, вы даже можете написать XmlSerializationWrapper<T>, который реализует IXmlSerializable и использует отражение, чтобы получить атрибуты [Xml...] T и его членов, чтобы определить, как форматировать / читать XML добавление / использование атрибута type . Но в этот момент, вероятно, менее безумно просто использовать решение Ивана.

...