如何XML序列化’类型’

如何序列化“类型”?

我想序列化为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) { } } 

我得到此exception:“不期望使用类型ConsoleApplication1.NewObject。使用XmlInclude或SoapInclude属性指定静态未知的类型。”

我在哪里放[XmlInclude]? 这有可能吗?

XML序列化仅将对象的公共字段和属性值序列化为XML流。 XML序列化不包括类型信息。 例如,如果库名称空间中存在Book对象,则无法保证将其反序列化为相同类型的对象。

来源: MSDN:介绍XML序列化

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);} } } 

您可以实现IXmlSerializable接口并使用Type.FullName (您可能还需要Type.AssemblyQualifiedName )进行序列化,使用Assembly.GetType(string)来反序列化您的类型元素。

我最终将Type名称转换为字符串以将其保存为XML。

反序列化时,我加载所有DLL并保存类型的名称并在字典中键入。 当我使用类型名称加载XML时,我可以在字典键中查找名称,并根据字典值知道类型。

问题是XmlData.T的类型实际上是“System.RuntimeType”(Type的子类),遗憾的是它不是公共的。 这意味着没有办法告诉序列化期望什么类型。 我建议只序列化类型的名称,或Jay Bazuzi建议的完全限定名称。

丑陋但有效。 创建一个包含对象类型和序列化字符串的类。

 Class dummie { Type objType; string xml; }