Сериализация списка строго типизированных объектов - PullRequest
1 голос
/ 20 марта 2009

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

public class AreaFields
{
    [XmlArray("Items")]
    [XmlArrayItem("Item")]
    public List<Fields> Fields { set; get; }

    [XmlAttribute]
    int id { set; get; }
}

public class Fields
{
    [XmlAttribute]
    public string Name { set; get; }
}

Во всем приложении я использовал List<AreaFields> Теперь мне нужно сериализовать список в XML. Я надеюсь получить:

   <SomeXMLTag>
    <AreaFields id='1000'>
     <Items>
       <Item Name="Test1" />
       <Item Name="Test2" />
     </Items>
    </AreaFields>
    <AreaFields id='1001'>
     <Items>
       <Item Name="Test1" />
       <Item Name="Test2" />
     </Items>
    </AreaFields>
    </SomeXMLTag>

Поскольку я не могу сериализовать List <> (или я могу?), Мне придется сериализовать каждый элемент списка.

Ex: List<AreaFields> list = new List<AreaFields>();
//    more code to add to list
    list[0].GetRawXML(); //A method i have to serialize

Ответы [ 4 ]

5 голосов
/ 20 марта 2009

Вам понадобится класс-обёртка; затем сериализуйте экземпляр MyWrapper, чтобы получить xml согласно вашему примеру.

[XmlRoot("SomeXMLTag")]
public class MyWrapper
{
    [XmlElement("AreaFields")]
    public List<AreaFields> AreaFields { get; set; }
}

public class AreaFields
{
    [XmlArray("Items")]
    [XmlArrayItem("Item")]
    public List<Fields> Fields { set; get; }

    [XmlAttribute]
    public int id { set; get; }
}

public class Fields
{
    [XmlAttribute]
    public string Name { set; get; }
}
4 голосов
/ 20 марта 2009

Вы можете сериализовать список <>. Прочитайте здесь для атрибутов, которые я использовал.

0 голосов
/ 22 марта 2009

Обобщения Java работают по типу стирания. Это своего рода означает, что когда приложение на самом деле запущено, JVM не заботится о генериках. Компилятор обращает на них внимание, а затем отбрасывает их из байт-кода (хотя некоторые аннотации помещаются в файл .class и т. Д. И т. Д.)

Так что сериализация и десериализация объектов универсального типа - это не просто. Он десериализуется как список, и вы разыгрываете его.

0 голосов
/ 20 марта 2009
using System;
using System.Collections.Generic;
using System.Xml;
using System.Xml.Serialization;
using System.Text;
using System.IO;

namespace Utils
{
    public class XMLSerializer
    {
        public static Byte[] StringToUTF8ByteArray(String xmlString)
        {
            return new UTF8Encoding().GetBytes(xmlString);
        }

        public static String SerializeToXML<T>(T objectToSerialize)
        {
            StringBuilder sb = new StringBuilder();

            XmlWriterSettings settings = 
                new XmlWriterSettings {Encoding = Encoding.UTF8, Indent = true};

            using (XmlWriter xmlWriter = XmlWriter.Create(sb, settings))
            {
                if (xmlWriter != null)
                {
                    new XmlSerializer(typeof(T)).Serialize(xmlWriter, objectToSerialize);
                }
            }

            return sb.ToString();
        }

        public static void DeserializeFromXML<T>(string xmlString, out T deserializedObject) where T : class
        {
            XmlSerializer xs = new XmlSerializer(typeof (T));

            using (MemoryStream memoryStream = new MemoryStream(StringToUTF8ByteArray(xmlString)))
            {
                deserializedObject = xs.Deserialize(memoryStream) as T;
            }
        }
    }
}

Затем, когда вы хотите распечатать список, выполните:

List<AreaFields> list = new List<AreaFields>();
//    more code to add to list
Console.WriteLine(Utils.XMLSerializer.SerializeToXML(areaFields));

EDIT : Изменен сериализатор, чтобы избежать одного из двоичных преобразований. Вы должны убедиться, что все свойства, которые вы хотите сериализовать, являются общедоступными, и что у вас есть конструктор, который также не принимает параметров.

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