Как сериализовать универсальный класс в XML? - PullRequest
4 голосов
/ 22 февраля 2012

Объекты следующего класса можно сериализовать в XML по назначению, если фактический тип универсального поля Object содержится в списке XmlElement атрибутов:

public class SerializedObject<T> : Serializable where T : Serializable
{
    [System.Xml.Serialization.XmlElement(Type = typeof(Weapon))]
    [System.Xml.Serialization.XmlElement(Type = typeof(Armor))]
    [System.Xml.Serialization.XmlElement(Type = typeof(QuestItem))]
    public T Object;

    public string ObjectId;
    public int ID;

    public SerializedObject() { }

    public SerializedObject(T _object)
    {
        Object = _object;
        ID = Object.Id;
        ObjectId = Object.ObjectId;
    }
}

вопрос:

Как я могу сериализовать объект этого класса, включая общее поле Object без указания всех возможных типов для T в XmlElement атрибутах?

1 Ответ

2 голосов
/ 22 февраля 2012

Я тоже столкнулся с этим.Я создал класс-оболочку:

public static XmlDocument SerializeToXmlDocument<XmlEntity>(XmlEntity o)
{
    XmlDocument xdoc;
    SerializeWrapper<XmlEntity> wrapper = new SerializeWrapper<XmlEntity>();
    wrapper.XmlObject = o;

    XmlSerializer xs = new XmlSerializer(wrapper.GetType());
    using (MemoryStream ms = new MemoryStream())
    {
        xs.Serialize(ms, wrapper);
        xdoc = new XmlDocument();
        ms.Position = 0;
        xdoc.Load(ms);
    }

    return xdoc;
}

Вот класс, используемый для переноса объекта

[XmlRoot("Root")]
public class SerializeWrapper<TObject>
{
    [XmlAttribute()]
    public string Name { get; set; }

    public TObject XmlObject { get; set; }
}

Теперь вы можете просто вызвать его как:

Weapon weapon = new Weapon()
var xdoc = SerializeToXmlDocument<Weapon>(weapon);
...