如何将通用类序列化为XML?

Gab*_*iel 5 c# generics xml-serialization

只要属性Object列表中包含通用字段的实际类型,就可以按预期将以下类的对象序列化为XML 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

问题是:

如何在Object不为Tin XmlElement属性指定所有可能类型的情况下序列化此类的对象(包括通用字段)?

anA*_*ent 2

我也遇到了这个。我所做的是创建一个包装类:

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;
}
Run Code Online (Sandbox Code Playgroud)

这是用于包装对象的类

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

    public TObject XmlObject { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

现在,您可以将其称为:

Weapon weapon = new Weapon()
var xdoc = SerializeToXmlDocument<Weapon>(weapon);
Run Code Online (Sandbox Code Playgroud)