序列化一个BigInteger

本文关键字:一个 BigInteger 序列化 | 更新日期: 2023-09-27 18:02:44

是否存在将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属性没有。是否有一种方法来序列化这个属性?

序列化一个BigInteger

不幸的是,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),并将其隐藏在智能感知之外。

[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);
        }
    }
}