序列化BigInteger

TK.*_*TK. 5 .net c# serialization biginteger xml-serialization

是否有任何方法将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; }
}
Run Code Online (Sandbox Code Playgroud)

Report类中的所有其他属性都会正确序列化,但BigInteger属性不会.有没有办法序列化这个属性?

Jon*_*son 4

不幸的是XmlSerializer,它被设计为使用标准 XML 模式创建可描述的 XML;这些是在 .Net 1.0 阶段的框架中的(这意味着不支持xs:integer )。

IXml可序列化

您将需要修改该类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());
    }
}
Run Code Online (Sandbox Code Playgroud)

代理属性 (虽然这看起来有代码味道,但它更便携)

使用受支持的架构类型(最有可能是 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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)