如何XML序列化'类型'

时间:2008-11-14 17:54:39

标签: c# xml serialization

如何序列化“类型”?

我想将具有属性的对象序列化为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]?这甚至可能吗?

6 个答案:

答案 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对象,则无法保证将其反序列化为相同类型的对象。

来源:MSDN: Introducing XML Serialization

答案 4 :(得分:1)

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

答案 5 :(得分:1)

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

Class dummie
{
    Type objType;
    string xml;
}