【问题标题】:Serializing a BigInteger序列化 BigInteger
【发布时间】:2011-10-07 11:25:14
【问题描述】:

是否有任何方法可以将 BigInteger 序列化到 XML 文件或从 XML 文件序列化?

下面是一个简短的 sn-p,它演示了我当前如何序列化类:

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 属性没有。有没有办法序列化这个属性?

【问题讨论】:

  • 仅供参考,我尝试了TypeConverter,并且由于 XML Schema 支持类型的要求; XmlSerializer 不支持它(按设计)。

标签: c# .net serialization xml-serialization biginteger


【解决方案1】:

不幸的是,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);
        }
    }
}

【讨论】:

  • 感谢 IXmlSerializable 接口的建议。我没有搞乱 BigInteger 类,而是在 Report 类中实现了 IXmlSerializable 接口。这样我就可以管理整个类的序列化。
  • XSD 规范确实有一个真正的整数类型——integer;它源自 XSD 的“BigRational”类型decimal,它支持完整的(数学)有理数集。 (它还有 intlong 用于映射到常见计算机类型的 32 位和 64 位签名类型。)
  • 有趣(考虑到我在那儿引用了 Microsoft),在这种情况下,BigInteger 类可能是实现 IXmlSerializable 的最佳位置。
  • IMO 问题的原因是 XmlSerializer 设计不当。体面的序列化程序需要支持非侵入式扩展点。将序列化混合到要序列化的类中是丑陋的 IMO。
  • 但不幸的是我们需要处理它。有一些第三方 XmlSerializer 应该会更好,但它们不是免费的,我不确定它们是否能应对这类问题。
猜你喜欢
  • 2021-02-23
  • 2018-07-18
  • 2019-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-06
  • 1970-01-01
相关资源
最近更新 更多