java xmlserializer,XmlSerializer-反映类型错误

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

XmlSerializer serializer = new XmlSerializer(typeof(DataClass));

我正在说一个例外:

反映类型时发生错误。

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

#1楼

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

我发现周围的工作在这里 。

#2楼

我遇到了连续两个元素的顺序相同的情况

[System.Xml.Serialization.XmlElementAttribute(IsNullable = true, Order = 0, ElementName = "SeriousInjuryFlag")]

....一些代码...

[System.Xml.Serialization.XmlElementAttribute(IsNullable = true, Order = 0, ElementName = "AccidentFlag")]

当我更改代码以将类中每个新Property的顺序递增一时,错误消失了。

#3楼

我最常见的原因:

- the object being serialized has no parameterless constructor

- the object contains Dictionary

- the object has some public Interface members

#4楼

如果需要处理特定的属性(即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类可能很简单。

#5楼

[System.Xml.Serialization.XmlElementAttribute(“ strFieldName”,Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]

//要么

[XmlIgnore]字符串[] strFielsName {get; set;}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值