代码之家  ›  专栏  ›  技术社区  ›  Robert Deml

如何用XML序列化“类型”

  •  12
  • Robert Deml  · 技术社区  · 16 年前

    我想将具有对象类型属性的对象序列化为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)
            {
    
            }
        }
    

    我得到一个例外:

    我应该将[xmlclude]放在哪里?这可能吗?

    6 回复  |  直到 16 年前
        1
  •  19
  •   TheSean    13 年前

    Type 类无法序列化,因为 System.RuntimeType

    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);}
        }
    }
    
        2
  •  3
  •   M. Jahedbozorgan    3 年前

    XML序列化仅将对象的公共字段和属性值序列化为XML流。 XML序列化不包括类型信息。

    资料来源: Details of XML serialization | Microsoft Docs

        3
  •  3
  •   Jay Bazuzi Buck Hodges    16 年前

    IXmlSerializable Type.FullName (您可能还需要 Type.AssemblyQualifiedName )用于序列化和 Assembly.GetType(string) 用于反序列化类型元素。

        4
  •  3
  •   Robert Deml    16 年前

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

        5
  •  1
  •   Robert Wagner    16 年前

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

        6
  •  1
  •   brainimus user417509    13 年前

    虽然很难看,但很管用。创建一个包含对象类型和序列化字符串的类。

    前任

    Class dummie
    {
        Type objType;
        string xml;
    }