如何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; }