序列化程序-有一个错误反映类型
-
09-06-2019 - |
题
使用。网2.0的,我有一个综合数据类,不会有的 [Serializable]
属性。我创建一个 XMLSerializer
类和通过,成的构造:
XmlSerializer serializer = new XmlSerializer(typeof(DataClass));
我得到一个例外说:
有一个错误反映类型。
里面的数据类还有另外一个复合的对象。这是否还需要有的 [Serializable]
属性,或者通过具有上顶的目的,不适用递归它所有对象吗?
解决方案
来看看内部异常你得到。它会告诉你哪些领域/特性是有问题的顺序.
你可以排除的领域/特性从xml化装饰他们的 [XmlIgnore]
属性。
我不认为 XmlSerializer
使用 [Serializable]
属性,所以我怀疑这就是问题所在。
其他提示
记住化的课程必须默认(即无参)的构造.如果你有没有构造,这是罚款;但是如果你有一个构造与一个参数,则需要增加的默认。
我有一个类似的问题,它原来的那串行器不能区分2类,我不得不与相同的名称(一个是一个子类,其他)。内部异常看上去是这样的:
'类BaseNamespace.1级'和'BaseNamespace.SubNamespace.1级'这两个用XML类型的姓名、'1级,从空间".使用XML属性指定一个独特的XML名称和/或名称空间的类型。
在BaseNamespace.SubNamespace.1级是一个子类BaseNamespace.1级.
什么我要做的就是增加的一个属性的一个类(我加入基类):
[XmlType("BaseNamespace.Class1")]
注:如果你有更多的层上课,你需要添加的一个属性,它们。
还要知道, XmlSerializer
不列化的抽象性质..看看我的问题 在这里, (我已经增加的解决方案的代码)..
最常见的原因,通过我:
- the object being serialized has no parameterless constructor
- the object contains Dictionary
- the object has some public Interface members
所有对象在化曲线图必须要序列化。
由于 XMLSerializer
是一个黑箱,检查这些链接如果你想要调试一步的进化过程..
如果你需要处理的特定特性(即字典,或任何类),可以实现的 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
}
还有一个有趣的 文章, ,这表明一个优雅的方式来实现一个复杂的方式的"扩展"的序列化程序.
该条说:
IXmlSerializable复盖在官方文件,但文件的国家,它不是供公众使用,并没有提供任何信息。这表明,开发团队希望保留修改的权利,禁止,或者甚至完全消除这种扩展性挂钩的道路。然而,只要你愿意接受这种不确定和处理可能发生的变化的未来,没有任何理由你不可以利用它。
因此,我建议来实现你自己的 IXmlSerializable
课程,以避免太多的复杂的实现。
...它可以直接实现我们的定义 XmlSerializer
类使用的反思。
我已经发现了该词典类。网2.0的不是序列化使用XML,但将及时的二进制序列化是使用。
我发现了一个工作周围 在这里,.
我最近得到了这个网络的参考分类当添加一个新的财产。自动产生类是添加以下的属性。
[System.Xml.Serialization.XmlElementAttribute(Order = XX)]
我需要添加一个类似的属性与一个以一个高于过去在自动产生的顺序和这个固定的,它为我。
我也认为,序列化属性,必须对的对象,但除非我是一个完全菜鸟(我在中间一个晚上的编码届会议)的以下作品 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();
}
}
}
我会想象的序列化程序是使用反映在公共性质。
我只是得到了同样的错误以及发现了一种财产的类型 IEnumerable<SomeClass>
是的问题。它的出现, IEnumerable
不能化。
相反,一个能使用 List<SomeClass>
.
我有一个情况是相同的两个要素中的一排
[System.Xml.Serialization.XmlElementAttribute(IsNullable = true, Order = 0, ElementName = "SeriousInjuryFlag")]
....一些代码...
[System.Xml.Serialization.XmlElementAttribute(IsNullable = true, Order = 0, ElementName = "AccidentFlag")]
当时我改变了代码增加了一个为每一个新的酒类,错误就走了。
还注意到,你不能化用户接口控制的任何对象您要穿上的剪贴板必须是可串行,否则它无法通过其他进程。
我已经被使用 NetDataSerialiser
类serialise
我域课程。 NetDataContractSerializer类.
该领域类之间共享的客户和服务器。
[系统。Xml。序列化。XmlElementAttribute("strFieldName",形成=系统。Xml。架构。XmlSchemaForm.不合格的)]
//或
[XmlIgnore] string[]strFielsName{获得;设置;}
我有同样的问题,并在我的情况的对象有一个ReadOnlyCollection.集合必须实施方法加以序列化。