1

IXmlSerializable を使用しようとすると、いくつかの問題が発生しました。WriteXml が逆シリアル化するときに、ReadXml メソッドが呼び出されないようです。

これは、コードのスリム化されたバージョンです。

public interface ICharacter { 
string FullName { get; set; }
}

public class Character : ICharacter, IXmlSerializable {
    public string FullName { get; set; }

    public Character() {
        //apply default character information
        FullName = string.Empty;
    }
}

public void ReadXml(XmlReader reader) {
    if (reader == null) return;
    //just using null to see if it's called, i've used a break point to check if it was fired
}

public void WriteXml(XmlWriter writer) {
    writer.WriteElementString("FullName", FullName);
}
}

シリアル化および逆シリアル化するには、次のようにします。

        //serialise example
        Character character = new Character();
        using (StringWriter stringWriter = new StringWriter()) {
            XmlSerializer xmlSerializer = new XmlSerializer(typeof(Character));
            xmlSerializer.Serialize(stringWriter, character);
            xml = stringWriter.ToString();
        }            

        //deserialise example 
        using (StringReader stringReader = new StringReader(xml)) {
            XmlSerializer xmlSerializer = new XmlSerializer(typeof(UserCharacter));
            _character = (Character)xmlSerializer.Deserialize(stringReader);
        }

このクラスのセットアップに何か問題がありますか?

4

2 に答える 2

1

私は当初、IXmlSerializable を継承することで、受信したすべての xml データを読み書きできるようになるという印象を受けていました。ただし、クラスの型が同じであることを確認するために検証が行われます。したがって、シリアライズとデシリアライズが必要でしたCharacter

私の意図は、子クラスをシリアライズできるようにすることでした。WriteXmlメソッドを使用し、メソッド内でリフレクションを使用して、ルート ノードに基づいて関連付けられた型を取得することで、これを管理しました。

この説明が他の誰かに役立つことを願っています。

于 2012-05-23T16:29:38.297 に答える
0
public class UserCharacter : Character
{
    public void ReadXml(XmlReader reader)
    {
        base.ReadXml(reader);
    }
    public void WriteXml(XmlWriter writer)
    {
        base.WriteXml(writer);
    }
}
于 2012-05-23T16:35:20.967 に答える