2

オブジェクトに逆シリアル化する必要がある XML があります。ほとんどの要素は文字列と整数に変換できますが、1 つの要素は数値として入力され、3 つのブール値に変換する必要があります。これは、ブール値への変換の背後にあるロジックです。

switch (_valFromXML)
        {
            case 0:
                _bool1= true;
                break;
            case 1:
                _bool2= true;
                break;
            case 2:
                _bool1= true;
                _bool2= true;
                break;
            case 3:
                _bool3= true;
                break;
            case 4:
                _bool1= true;
                _bool3= true;
                break;
            case 5:
                _bool2= true;
                _bool3= true;
                break;
            case 6:
                _bool1= true;
                _bool2= true;
                _bool3= true;
                break;
        }

この例のような暗黙の演算子を作成しようとしましたが、呼び出されているのは、パラメーターなしのコンストラクターだけです。

http://forums.asp.net/t/1187054.aspx

デシリアライズされるプロパティは次のとおりです。

private ConvertElement _convertElement;
[XmlElement("ConvertElement", typeof(ConvertElement))]
public ConvertElement ConvertElement
{
    get { return _convertElement; }
    set { _convertElement= value; }
}

一日中整数に逆シリアル化できますが、何らかの理由で要素をカスタム型に変換できません。要素から作成しようとしているクラスは次のとおりです。

[Serializable]
public class ConvertElement
{
     int _value;
     bool _bool1;
     bool _bool2;
     bool _bool3;

    public static implicit operator int(ConvertElement x)
    {
        return x.Value;
    }
    public static implicit operator ConvertElement(int value)
    {
        return new ConvertElement(value);
    }

    public int Value
    {
        get { return _value; }
        set { _value = value; }
    } 

    public ConvertElement()
    {
    }

    public DocSelection(int value) 
    {
        _value= value;
        switch (_value)
        {
            case 0:
                _bool1= true;
                break;
            case 1:
                _bool2= true;
                break;
            case 2:
                _bool1= true;
                _bool2= true;
                break;
            case 3:
                _bool3= true;
                break;
            case 4:
                _bool1= true;
                _bool3= true;
                break;
            case 5:
                _bool2= true;
                _bool3= true;
                break;
            case 6:
                _bool1= true;
                _bool2= true;
                _bool3= true;
                break;
        }
    }
}
4

1 に答える 1

1

IXmlSerializableカスタム逆シリアル化を実行するには、インターフェイスを使用する必要がある場合があります

例:

public class ConvertElement : IXmlSerializable
{

    private int _value;
    private bool _bool1;
    private bool _bool2;
    private bool _bool3;

    public ConvertElement()
    {
    }

    #region IXmlSerializable implementation

    public void WriteXml(XmlWriter writer)
    {
        writer.WriteValue(_value);
    }

    public void ReadXml(XmlReader reader)
    {
        _value = int.Parse(reader.ReadString());
        DocSelection(_value);
    }

    public XmlSchema GetSchema()
    {
        return null;
    }

    #endregion

    public void DocSelection(int value)
    {
        _value = value;
        switch (_value)
        {
            case 0:
                _bool1 = true;
                break;
            case 1:
                _bool2 = true;
                break;
            case 2:
                _bool1 = true;
                _bool2 = true;
                break;
            case 3:
                _bool3 = true;
                break;
            case 4:
                _bool1 = true;
                _bool3 = true;
                break;
            case 5:
                _bool2 = true;
                _bool3 = true;
                break;
            case 6:
                _bool1 = true;
                _bool2 = true;
                _bool3 = true;
                break;
        }
    }

私のテスト:

XML:

<?xml version="1.0"?>
<TestClass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <ConvertElement>6</ConvertElement>
</TestClass>

テストクラス:

public class TestClass
{
    private ConvertElement _convertElement;
    [XmlElement("ConvertElement", typeof(ConvertElement))]
    public ConvertElement ConvertElement
    {
        get { return _convertElement; }
        set { _convertElement = value; }
    }
}

シリアライズ:

TestClass test = new TestClass
{
    ConvertElement = new ConvertElement()
};

XmlSerializer xmlSerializer = new XmlSerializer(typeof(TestClass));
using (FileStream stream = new FileStream("c:\\ConvertElement.xml", FileMode.OpenOrCreate))
{
    xmlSerializer.Serialize(stream, test);
}

逆シリアル化:

XmlSerializer xmlSerializer = new XmlSerializer(typeof(TestClass));
using (FileStream stream = new FileStream("c:\\ConvertElement.xml", FileMode.Open))
{
  var result = xmlSerializer.Deserialize(stream);
}

結果:

andd を変換し_value、ブール値を設定します

ここに画像の説明を入力

于 2013-03-06T00:47:05.410 に答える