是否有任何方法将BigInteger与XML文件串行化?
下面是一个简短的片段,演示了我目前如何序列化类:
static public void SerializeToXML( Report report )
{
XmlSerializer serializer = new XmlSerializer( typeof( Report ) );
using ( TextWriter textWriter = new StreamWriter( Path.Combine( report.Path, report.Filename ) ) )
{
serializer.Serialize( textWriter, report );
}
}
[Serializable]
public class Report
{
public BigInteger CurrentMaximum { get; set; }
}
Report类中的所有其他属性都会正确序列化,但BigInteger属性不会。有没有办法序列化这个属性?
答案 0 :(得分:4)
不幸的是XmlSerializer
旨在使用标准XML Schema创建可描述的XML;在.Net 1.0阶段期间在框架中(这意味着xs:integer不受支持)。
<强> IXmlSerializable的强>
您需要修改BigInteger
类并为其添加IXmlSerializable
接口。如果您需要使用XSD往返(例如WebService引用),这可能会导致问题。
public class BigInteger : IXmlSerializable
{
public int Value;
public System.Xml.Schema.XmlSchema GetSchema()
{
// You should really a create schema for this.
// Hardcoded is fine.
return null;
}
public void ReadXml(System.Xml.XmlReader reader)
{
Value = int.Parse(reader.ReadString());
}
public void WriteXml(System.Xml.XmlWriter writer)
{
writer.WriteValue(Value.ToString());
}
}
代理属性 (虽然看起来它有代码味道,但它更便携)
使用支持的架构类型(最可能是xs:string)创建一个新属性,并将其隐藏在intellisense中。
[XmlRoot("foo")]
public class SerializePlease
{
[XmlIgnore]
public BigInteger BigIntValue;
[XmlElement("BigIntValue")]
[EditorBrowsable(EditorBrowsableState.Never)]
public string BigIntValueProxy
{
get
{
return BigIntValue.ToString();
}
set
{
BigIntValue = BigInteger.Parse(value);
}
}
}