[Serializable]
属性。我正在创建一个XMLSerializer
类,并将其传递给构造函数:XmlSerializer serializer = new XmlSerializer(typeof(DataClass));
我得到一个异常提示:
是一个反映类型的错误。
在数据类中还有另一个复合对象。这是否还需要具有
[Serializable]
属性,或者将其放在顶部对象上,是否将它递归地应用于内部的所有对象?#1 楼
查看您所得到的内部异常。它将告诉您序列化哪个字段/属性。通过使用
[XmlIgnore]
属性装饰字段/属性,可以将它们从xml序列化中排除。 XmlSerializer
不使用[Serializable]
属性,所以我怀疑这是问题所在。#2 楼
请记住,序列化的类必须具有默认的(即无参数)构造函数。如果您根本没有构造函数,那很好。但是如果您有一个带有参数的构造函数,则还需要添加默认的构造函数。评论
感谢您的提醒!我讨厌这是一个运行时错误,几乎没有解释。
–杰瑞德·厄普迪克(Jared Updike)
08年11月17日23:33
我不断重复犯这个错误。感谢您提醒我使用无参数构造函数^^
– aZtraL-EnForceR
2014年5月31日19:50
#3 楼
我有一个类似的问题,事实证明,序列化程序无法区分同名的2个类(一个是另一个的子类)。内部异常如下所示:“类型BaseNamespace.Class1”和“ BaseNamespace.SubNamespace.Class1”都使用名称空间“”中的XML类型名称“ Class1”。使用XML属性为类型指定唯一的XML名称和/或名称空间。
其中BaseNamespace.SubNamespace.Class1是BaseNamespace.Class1的子类。
我需要做的是向其中一个类(我添加到基类)中添加属性:
[XmlType("BaseNamespace.Class1")]
注意:如果您有更多层的类,则还需要为其添加一个属性。
评论
这为我解决了这个问题,谢谢+1;我对几个Processor *对象有一个相似的设置,每个对象都有一个Config内部类。运行时无法区分SomeNS.Processor1.Config和SomeNS.Processor2.Config。
–damix911
2012年6月3日于20:38
#4 楼
另请注意,XmlSerializer
无法序列化抽象属性。.请参阅此处的问题(已向其中添加解决方案代码)。.XML序列化和继承的类型
#5 楼
我最常见的原因: - the object being serialized has no parameterless constructor
- the object contains Dictionary
- the object has some public Interface members
#6 楼
序列化图中的所有对象都必须可序列化。由于
XMLSerializer
是黑盒,因此如果要进一步调试序列化过程,请检查这些链接。.更改XmlSerializer在其中输出临时程序集的位置
如何:调试到.NET XmlSerializer生成的程序集
#7 楼
如果您需要处理特定的属性(例如Dictionary或任何类),则可以实现IXmlSerialiable接口,该接口将为您提供更多自由,但需要付出更多冗长的编码。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
}
有一篇有趣的文章,展示了一种优雅的方法来实现“扩展” XmlSerializer的复杂方法。
文章说:
IXmlSerializable包含在官方文档中,但该文档指出,该文档不适用于公共用途,并且不提供任何其他信息。这表明开发团队希望保留修改,禁用甚至完全删除此可扩展性的权利。但是,只要您愿意接受这种不确定性并应对将来可能发生的变化,就没有任何理由不能利用它。
我建议您实现自己的
IXmlSerializable
类,以避免过多的实现。...使用反射实现我们自定义的
XmlSerializer
类可能很简单。#8 楼
我发现.Net 2.0中的Dictionary类无法使用XML进行序列化,但是在使用二进制序列化时可以很好地进行序列化。我在这里找到了工作。
#9 楼
最近,在添加新属性时,我在Web参考局部类中获得了此属性。自动生成的类正在添加以下属性。 [System.Xml.Serialization.XmlElementAttribute(Order = XX)]
我需要添加一个类似的属性,该属性的顺序比自动生成的序列中的最后一个顺序高一个对我来说。
#10 楼
我只是遇到了同样的错误,发现问题是类型为IEnumerable<SomeClass>
的属性。看来IEnumerable
无法直接序列化。相反,可以使用
List<SomeClass>
。#11 楼
我也认为Serializable属性必须在对象上,但是除非我是一个完整的菜鸟(我正处于深夜的编码会议中),否则SnippetCompiler的以下工作如下: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();
}
}
}
我想XmlSerializer在公共属性上使用反射。
#12 楼
我遇到这样的情况,连续两个元素的顺序相同[System.Xml.Serialization.XmlElementAttribute(IsNullable = true, Order = 0, ElementName = "SeriousInjuryFlag")]
....一些代码...
[System.Xml.Serialization.XmlElementAttribute(IsNullable = true, Order = 0, ElementName = "AccidentFlag")]
当我更改代码以将类中每个新Property的顺序递增一时,错误消失了。
#13 楼
创建具有数据类型Type
的属性时,出现了相同的错误。对此,我遇到了一个错误-反映类型有错误。我一直在检查调试坞站中每个异常的“ InnerException”,并得到了特定的字段名称(即Type
)。解决方案如下: [XmlIgnore]
public Type Type { get; set; }
#14 楼
还要注意,您不能序列化用户界面控件,并且要传递到剪贴板的任何对象都必须可序列化,否则无法传递给其他进程。#15 楼
我一直在使用NetDataSerialiser
类序列化我的域类。 NetDataContractSerializer类。域类在客户端和服务器之间共享。
#16 楼
我遇到了同样的问题,在我的情况下,该对象具有ReadOnlyCollection。集合必须实现Add方法才能可序列化。评论
这不是对该问题的正确答案。这个问题已经有其他15个答案。如果您认为自己的答案比其他答案更好,则应提供有关它的更多详细信息。提供一些代码和输出片段总是可以帮助用户。在发布答案之前,请考虑阅读-> stackoverflow.com/help/how-to-answer
–阿米特·菲尔坦卡(Amit Phaltankar)
17年5月26日在1:59
#17 楼
到目前为止,我对这里描述的所有解决方案都略有不同,因此对于任何未来的文明来说,这都是我的!我已声明数据类型为“时间”,因为原始类型为
TimeSpan
,随后更改为String
:[System.Xml.Serialization.XmlElementAttribute(DataType="time", Order=3)]
,但是实际类型是字符串
public string TimeProperty {
get {
return this.timePropertyField;
}
set {
this.timePropertyField = value;
this.RaisePropertyChanged("TimeProperty");
}
}
通过删除
DateType
属性Xml
可以序列化[System.Xml.Serialization.XmlElementAttribute(Order=3)]
public string TimeProperty {
get {
return this.timePropertyField;
}
set {
this.timePropertyField = value;
this.RaisePropertyChanged("TimeProperty");
}
}
#18 楼
[System.Xml.Serialization.XmlElementAttribute("strFieldName", Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
或
[XmlIgnore]
string [] strFielsName {get;set;}
评论
我的对象有一个Uri字段,导致了此异常; Uri类没有无参数的构造函数。谢谢你的提示。
–福德
2011-10-28 21:45
通过谷歌搜索解决了这个问题-我的特殊问题是在我的“待序列化”类中将一个属性设置为IList,当它需要成为List时。
– Paul Aldred-Bann
2012年10月8日13:06
人们如何看待“内部例外”?
–大卫
2012-12-17 3:47
或在手表中添加“ @exception”
– arolson101
2013年6月13日17:30
谢谢,这个答案帮助了我。我最初查看的是内部异常,只是看到提到主类。但是我意识到我可以深入研究innrexceptions的innerexceptions,最终,在5个级别以下,我发现了问题。我的课有冲突。谢谢。
–路易·范·唐德(Louis van Tonder)
13年7月12日在15:12