如何序列化“类型”?
我想将具有属性的对象序列化为XML,该属性是对象的类型。这个想法是,当它被反序列化时,我可以创建一个这种类型的对象。
public class NewObject
{
}
[XmlRoot]
public class XmlData
{
private Type t;
public Type T
{
get { return t; }
set { t = value; }
}
}
static void Main(string[] args)
{
XmlData data = new XmlData();
data.T = typeof(NewObject);
try
{
XmlSerializer serializer = new XmlSerializer(typeof(XmlData));
try
{
using (FileStream fs = new FileStream("test.xml", FileMode.Create))
{
serializer.Serialize(fs, data);
}
}
catch (Exception ex)
{
}
}
catch (Exception ex)
{
}
}
我得到这个例外: “不期望使用类型ConsoleApplication1.NewObject。使用XmlInclude或SoapInclude属性指定静态未知的类型。”
我在哪里放[XmlInclude]?这甚至可能吗?
答案 0 :(得分:18)
Type
类无法序列化,因为我们的代码无法访问System.RuntimeType
,它是内部CLR类型。您可以使用类型的名称来解决此问题,例如:
public class c
{
[XmlIgnore]
private Type t;
[XmlIgnore]
public Type T {
get { return t; }
set {
t = value;
tName = value.AssemblyQualifiedName;
}
}
public string tName{
get { return t.AssemblyQualifiedName; }
set { t = Type.GetType(value);}
}
}
答案 1 :(得分:3)
您可以实现IXmlSerializable
界面并使用Type.FullName
(您可能还需要Type.AssemblyQualifiedName
)进行序列化,并使用Assembly.GetType(string)
进行反序列化您的类型元素。
答案 2 :(得分:3)
我最终将Type名称转换为字符串以将其保存为XML。
反序列化时,我加载所有DLL并保存类型的名称并在字典中键入。当我使用类型名称加载XML时,我可以在字典键中查找名称,并根据字典值知道类型。
答案 3 :(得分:3)
XML序列化仅将对象的公共字段和属性值序列化为XML流。 XML序列化不包含类型信息。例如,如果库名称空间中存在Book对象,则无法保证将其反序列化为相同类型的对象。
答案 4 :(得分:1)
问题是XmlData.T的类型实际上是“System.RuntimeType”(Type的子类),遗憾的是它不是公共的。这意味着没有办法告诉序列期望什么类型。我建议只序列化类型的名称,或Jay Bazuzi建议的完全限定名称。
答案 5 :(得分:1)
丑陋但它有效。创建一个包含对象类型和序列化字符串的类。
离
Class dummie
{
Type objType;
string xml;
}