1

SOで型をシリアル化するためのさまざまなソリューションがありますが、必要な はnull許容型に逆シリアル化するためのソリューションです。SpecifiedおよびShouldSerailiseの手法は、逆シリアル化には適用されないようです。Nullable

したがって、XMLドキュメントに属性がない場合は、クラスのintを0ではなくnullにします。

残念ながら、シリアル化はリフレクションエラーをスローするため、null許容整数に直接シリアル化することはできません。

したがって、以下の例では、result2.SomeIntnullになりたいと思っていますresult1.SomeInt = 12

class TestProgram
{
    public static void Main(string[] args)
    {
        XmlSerializer deserializer = new XmlSerializer(typeof(Result));

        Stream xmlStream = new MemoryStream(Encoding.ASCII.GetBytes(docWithVal().InnerXml));
        var result1 = (Result)deserializer.Deserialize(xmlStream);

        Stream xmlStream2 = new MemoryStream(Encoding.ASCII.GetBytes(docWithoutVal().InnerXml));
        var result2 = (Result)deserializer.Deserialize(xmlStream2);
    }

    public static XmlDocument docWithoutVal()
    {
        var doc = new XmlDocument();
        doc.LoadXml(@"<Result/>");
        return doc;
    }

    public static XmlDocument docWithVal()
    {
        var doc = new XmlDocument();
        doc.LoadXml(@"<Result SomeInt = ""12""/>");
        return doc;
    }
}

[Serializable]
public class Result
{
    [XmlAttribute]
    public int? SomeInt { get; set; }
}
4

1 に答える 1

1

逆シリアル化後に指定された手法を実際に使用できます。Resultクラスを次のように変更します。

[Serializable]
public class Result
{
    [XmlAttribute]
    public int SomeInt { get; set; }

    [XmlIgnore]
    public bool SomeIntSpecified;
}

Nullable型の逆シリアル化後にこのロジックを使用します。

var value = SomeIntSpecified ? SomeInt : null;

IXmlSerializableまたは、Resultクラスに実装することもできます。

[Serializable]
public class Result : IXmlSerializable
{
    public int? SomeInt { get; set; }

    #region IXmlSerializable members

    public void WriteXml(XmlWriter writer)
    {
        if (SomeInt != null) { writer.WriteValue(writer); }
    }

    public void ReadXml(XmlReader reader)
    {
        int result;
        if (int.TryParse(reader.GetAttribute("SomeInt"), out result))
            SomeInt = result;
    }

    public XmlSchema GetSchema()
    {
        return (null);
    }

    #endregion
}

参照: XmlSerializer を使用して Nullable に逆シリアル化する

于 2012-11-14T15:05:00.690 に答える