0

XmlSerializer を使用して複数のオブジェクトをシリアル化したい。シリアライズ操作は正常に実行されますが、オブジェクトをデシリアライズしたい場合、デシリアライズは最初のオブジェクトのみを返し、再度呼び出すとnullが返されます!

シリアル化をカスタムにしたいので、 IXmlSerializabe を実装しました:

public class Person : IXmlSerializable
{
    public int id;
    public string name;

    public virtual void WriteXml(XmlWriter writer)
    {
        Type type = this.GetType();
        FieldInfo[] pInfo = type.GetFields();

        foreach (FieldInfo property in pInfo)
        {
            object value = property.GetValue(this);
            writer.WriteElementString(property.Name, value.ToString());
        }
    }

    public virtual void ReadXml(XmlReader reader)
    {

        Type type = this.GetType();
        FieldInfo[] pInfo = type.GetFields();

        foreach (FieldInfo property in pInfo)
        {
            object value = null;
            reader.ReadToFollowing(property.Name);

            Type propertyType = property.FieldType;
            value = reader.ReadElementContentAs(property.FieldType, null);
            type.GetField(property.Name).SetValue(this, value);                
        }

        reader.Read();
    }

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

そして、私はそれを次のように呼びます:

        // Serialize
        Type type = typeof(Person);
        XmlSerializer serializer = new XmlSerializer(type);
        TextWriter writer = new StreamWriter(filename);

        foreach (Person c in list)
        {
            serializer.Serialize(writer, c);
        }
        writer.Close();

        // Deserialize
        XmlReader reader = XmlReader.Create(filename);
        var objectsList = serializer.Deserialize(reader);

Serialize は、次の xml ファイルを作成します。

    <?xml version="1.0" encoding="utf-8"?>
    <Person>
      <id>1</id>
      <name>name1</name>
    </Person><?xml version="1.0" encoding="utf-8"?>
    <Person>
      <id>2</id>
      <name>name2</name>
    </Person>
4

1 に答える 1

2

私は答えを見つけました。修正コード:

    public virtual void ReadXml(XmlReader reader)
    {

        Type type = this.GetType();
        FieldInfo[] pInfo = type.GetFields();

        // Added
        reader.ReadStartElement();

        foreach (FieldInfo property in pInfo)
        {
            object value = null;
            reader.ReadToFollowing(property.Name);

            Type propertyType = property.FieldType;
            value = reader.ReadElementContentAs(property.FieldType, null);
            type.GetField(property.Name).SetValue(this, value);                
        }

        // Added
        reader.ReadEndElement();
    }

    // Serialize
    Type type = typeof(List<Person>); //Changed Type to List of Persons
    XmlSerializer serializer = new XmlSerializer(type);
    TextWriter writer = new StreamWriter(filename);

    serializer.Serialize(writer, list);

    writer.Close();
于 2013-09-14T13:21:38.493 に答える