C# XmlSerializer-反映类型时出错

C# XmlSerializer-反映类型时出错,c#,.net,xml,serialization,.net-2.0,C#,.net,Xml,Serialization,.net 2.0,使用C#.NET 2.0,我有一个复合数据类,上面有[Serializable]属性。我正在创建一个XMLSerializer类,并将其传递给构造函数: XmlSerializer serializer = new XmlSerializer(typeof(DataClass)); 我得到一个例外,说: 反射类型出错 在数据类内部有另一个复合对象。这是否也需要有[Serializable]属性,或者通过将其放在顶部对象上,它是否递归地将其应用于内部的所有对象?查看您得到的内部异常。它将告诉您哪

使用C#.NET 2.0,我有一个复合数据类,上面有
[Serializable]
属性。我正在创建一个
XMLSerializer
类,并将其传递给构造函数:

XmlSerializer serializer = new XmlSerializer(typeof(DataClass));
我得到一个例外,说:

反射类型出错


在数据类内部有另一个复合对象。这是否也需要有
[Serializable]
属性,或者通过将其放在顶部对象上,它是否递归地将其应用于内部的所有对象?

查看您得到的内部异常。它将告诉您哪个字段/属性在序列化时遇到问题

通过使用属性修饰字段/属性,可以从xml序列化中排除字段/属性


XmlSerializer
没有使用该属性,因此我怀疑这就是问题所在。

看看您得到的内部异常。它将告诉您哪个字段/属性在序列化时遇到问题

通过使用属性修饰字段/属性,可以从xml序列化中排除字段/属性


XmlSerializer
不使用该属性,所以我怀疑这就是问题所在。

还请注意,您不能序列化用户界面控件,并且任何要传递到剪贴板上的对象都必须是可序列化的,否则就不能传递到其他进程。

还请注意,您不能序列化用户界面控件,并且任何要传递到剪贴板上的对象都必须是可序列化的。

还请注意剪贴板必须可序列化,否则无法传递给其他进程。

序列化图中的所有对象都必须可序列化

由于
XMLSerializer
是一个黑盒,如果您想在序列化过程中进一步调试,请检查这些链接


序列化图中的所有对象都必须是可序列化的

由于
XMLSerializer
是一个黑盒,如果您想在序列化过程中进一步调试,请检查这些链接


< P>我也认为可序列化的属性必须在对象上,但是除非我是一个完整的NOOB(我在深夜编码会话的中间),下面的作品来自:


我想XMLSerialZER在公共属性上使用反射。

我也认为可序列化属性必须在对象上,但是除非我是一个完整的NOOB(我在深夜编码会话的中间),下面的工作是从:


我可以想象XmlSerializer正在公共属性上使用反射。

请记住,序列化类必须具有默认(即无参数)构造函数。如果你根本没有构造器,那很好;但是,如果您有一个带参数的构造函数,您也需要添加默认构造函数。

请记住,序列化类必须具有默认(即无参数)构造函数。如果你根本没有构造器,那很好;但是,如果您有一个带参数的构造函数,则还需要添加默认构造函数。

还要注意,
XmlSerializer
无法序列化抽象属性。。请参阅我的问题(我已向其添加了解决方案代码)


还要注意,
XmlSerializer
无法序列化抽象属性。。请参阅我的问题(我已向其添加了解决方案代码)


我一直在使用
NetDataSerialiser
类进行序列化 我的域类


域类在客户端和服务器之间共享。

我一直在使用
NetDataSerialiser
类进行序列化 我的域类


域类在客户端和服务器之间共享。

我发现.Net 2.0中的Dictionary类不能使用XML进行序列化,但在使用二进制序列化时可以很好地进行序列化


我找到了一份工作

我发现.Net 2.0中的Dictionary类不能使用XML进行序列化,但在使用二进制序列化时可以很好地进行序列化


我找到了一份工作

如果需要处理特定属性(即字典或任何类),可以实现该接口,这将允许您以更详细的编码为代价获得更大的自由度

有一个有趣的例子,它展示了一种优雅的方式来实现“扩展”XmlSerializer的复杂方式


文章说,

IXmlSerializable包含在官方文档中,但文档声明它不打算用于公共用途,并且没有提供除此之外的任何信息。这表明开发团队希望保留修改、禁用甚至完全删除此扩展性挂钩的权利。然而,只要你愿意接受这种不确定性并应对未来可能发生的变化,你就没有理由不利用它

因此,我建议实现自己的
IXmlSerializable
类,以避免太多复杂的实现


…使用反射实现自定义的
XmlSerializer
类可能很简单。

如果需要处理特定属性(即字典或任何类),可以实现接口,这将允许您以更详细的编码为代价实现更大的自由度

有一个有趣的例子,它展示了一种优雅的方式来实现“扩展”XmlSerializer的复杂方式


文章说,

IXmlSerializable包含在官方文档中,但文档声明它不打算用于公共用途,并且没有提供除此之外的任何信息。这表明开发团队希望保留修改、禁用甚至完全删除此扩展性挂钩的权利。然而,只要你愿意接受这种不确定性,并处理未来可能发生的变化,那么
using System;
using System.IO;
using System.Xml;
using System.Collections.Generic;
using System.Xml.Serialization;

public class Inner
{
    private string _AnotherStringProperty;
    public string AnotherStringProperty 
    { 
      get { return _AnotherStringProperty; } 
      set { _AnotherStringProperty = value; } 
    }
}

public class DataClass
{
    private string _StringProperty;
    public string StringProperty 
    { 
       get { return _StringProperty; } 
       set{ _StringProperty = value; } 
    }

    private Inner _InnerObject;
    public Inner InnerObject 
    { 
       get { return _InnerObject; } 
       set { _InnerObject = value; } 
    }
}

public class MyClass
{

    public static void Main()
    {
        try
        {
            XmlSerializer serializer = new XmlSerializer(typeof(DataClass));
            TextWriter writer = new StreamWriter(@"c:\tmp\dataClass.xml");
            DataClass clazz = new DataClass();
            Inner inner = new Inner();
            inner.AnotherStringProperty = "Foo2";
            clazz.InnerObject = inner;
            clazz.StringProperty = "foo";
            serializer.Serialize(writer, clazz);
        }
        finally
        {
            Console.Write("Press any key to continue...");
            Console.ReadKey();
        }
    }

}
public class NetService : IXmlSerializable
{
    #region Data

        public string Identifier = String.Empty;

        public string Name = String.Empty;

        public IPAddress Address = IPAddress.None;
        public int Port = 7777;

    #endregion

    #region IXmlSerializable Implementation

        public XmlSchema GetSchema() { return (null); }

        public void ReadXml(XmlReader reader)
        {
            // Attributes
            Identifier = reader[XML_IDENTIFIER];
            if (Int32.TryParse(reader[XML_NETWORK_PORT], out Port) == false)
            throw new XmlException("unable to parse the element " + typeof(NetService).Name + " (badly formatted parameter " + XML_NETWORK_PORT);
            if (IPAddress.TryParse(reader[XML_NETWORK_ADDR], out Address) == false)
            throw new XmlException("unable to parse the element " + typeof(NetService).Name + " (badly formatted parameter " + XML_NETWORK_ADDR);
        }

        public void WriteXml(XmlWriter writer)
        {
            // Attributes
            writer.WriteAttributeString(XML_IDENTIFIER, Identifier);
            writer.WriteAttributeString(XML_NETWORK_ADDR, Address.ToString());
            writer.WriteAttributeString(XML_NETWORK_PORT, Port.ToString());
        }

        private const string XML_IDENTIFIER = "Id";

        private const string XML_NETWORK_ADDR = "Address";

        private const string XML_NETWORK_PORT = "Port";

    #endregion
}
    [System.Xml.Serialization.XmlElementAttribute(Order = XX)]
[XmlType("BaseNamespace.Class1")]
[System.Xml.Serialization.XmlElementAttribute(IsNullable = true, Order = 0, ElementName = "SeriousInjuryFlag")]
[System.Xml.Serialization.XmlElementAttribute(IsNullable = true, Order = 0, ElementName = "AccidentFlag")]
 - the object being serialized has no parameterless constructor
 - the object contains Dictionary
 - the object has some public Interface members
[System.Xml.Serialization.XmlElementAttribute("strFieldName", Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
[XmlIgnore]
string [] strFielsName {get;set;}
[System.Xml.Serialization.XmlElementAttribute(DataType="time", Order=3)]
public string TimeProperty {
    get {
        return this.timePropertyField;
    }
    set {
        this.timePropertyField = value;
        this.RaisePropertyChanged("TimeProperty");
    }
}
[System.Xml.Serialization.XmlElementAttribute(Order=3)]
public string TimeProperty {
    get {
        return this.timePropertyField;
    }
    set {
        this.timePropertyField = value;
        this.RaisePropertyChanged("TimeProperty");
    }
}
    [XmlIgnore]
    public Type Type { get; set; }