Сериализация BigInteger - PullRequest
       13

Сериализация BigInteger

5 голосов
/ 18 июля 2011

Есть ли способ сериализации 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 - нет. Есть ли способ сериализации этого свойства?

1 Ответ

4 голосов
/ 18 июля 2011

К сожалению, XmlSerializer предназначен для создания XML-описаний с использованием стандартной XML-схемы;которые были в структуре во время фазы .Net 1.0 (что означает xs: целое число не поддерживается).

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

Свойство Proxy (хотя похоже, что оно имеет запах кодаэто гораздо более переносимо)

Создайте новое свойство с поддерживаемым типом схемы (наиболее вероятно, 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);
        }
    }
}
...