C# 如何将泛型类序列化为XML?
只要C# 如何将泛型类序列化为XML?,c#,generics,xml-serialization,C#,Generics,Xml Serialization,只要xmlement属性列表中包含泛型字段Object的实际类型,就可以按预期将以下类的对象序列化为XML: public class SerializedObject<T> : Serializable where T : Serializable { [System.Xml.Serialization.XmlElement(Type = typeof(Weapon))] [System.Xml.Serialization.XmlElement(Type = typ
xmlement
属性列表中包含泛型字段Object
的实际类型,就可以按预期将以下类的对象序列化为XML:
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;
}
}
public类SerializedObject:Serializable其中T:Serializable
{
[System.Xml.Serialization.xmlement(Type=typeof(武器))]
[System.Xml.Serialization.xmlement(Type=typeof(Armor))]
[System.Xml.Serialization.xmlement(Type=typeof(QuestItem))]
公众反对;
公共字符串ObjectId;
公共int ID;
公共序列化对象(){}
公共序列化对象(T_对象)
{
对象=_对象;
ID=Object.ID;
ObjectId=Object.ObjectId;
}
}
问题是:
如何序列化此类的对象,包括泛型字段
object
,而不在xmlement
属性中指定T
的所有可能类型?我也遇到了这个问题。我所做的是创建一个包装器类:
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;
}
publicstaticxmldocument序列化为XmlDocument(xmlo实体)
{
xml文档xdoc;
SerializeWrapper=新的SerializeWrapper();
wrapper.XmlObject=o;
XmlSerializer xs=新的XmlSerializer(wrapper.GetType());
使用(MemoryStream ms=new MemoryStream())
{
序列化(ms,包装器);
xdoc=新的XmlDocument();
ms.Position=0;
xdoc.负荷(ms);
}
返回xdoc;
}
下面是用于包装对象的类
[XmlRoot("Root")]
public class SerializeWrapper<TObject>
{
[XmlAttribute()]
public string Name { get; set; }
public TObject XmlObject { get; set; }
}
[XmlRoot(“根”)]
公共类序列化包装器
{
[XmlAttribute()]
公共字符串名称{get;set;}
公共对象XmlObject{get;set;}
}
现在,您可以将其称为:
Weapon weapon = new Weapon()
var xdoc = SerializeToXmlDocument<Weapon>(weapon);
武器=新武器()
var xdoc=文件(武器);
FYI,C#没有模板。它有非常不同的泛型。感谢您的澄清(我是编程新手)。