0

クラスがあり、それをXMLにシリアル化する必要がありますが、特定のプロパティのみ、つまりすべてではありません。これを行うための最良の方法は何ですか?別の方法は、プロパティとその値のディクショナリを作成してから、ディクショナリをシリアル化することです。

4

2 に答える 2

3

XmlAttributes.XmlIgnoreプロパティを見てください。シリアル化したくないフィールドを装飾するだけです。[XmlIgnoreAttribute()]

サンプルクラス:

// This is the class that will be serialized.  
public class Group
{
   // The GroupName value will be serialized--unless it's overridden. 
   public string GroupName;

   /* This field will be ignored when serialized--unless it's overridden. */
   [XmlIgnoreAttribute]
   public string Comment;
}
于 2012-10-16T08:01:33.290 に答える
0

上記の答えはうまくいきます。しかし、すべてがシリアル化され、指定されたフィールドのみがシリアル化されないという考えは好きではありませんでした。好みが違う場合、本当に、私は物事がどのように機能するかを制御するのが好きです。

MSからのISerializableの使用:「オブジェクトがそれ自体のシリアル化と逆シリアル化を制御できるようにします。」といくつかの反射:

    // Required by ISerializable
    public virtual void GetObjectData(SerializationInfo info, StreamingContext context)
    {
        FieldInfo[] fields = this.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance);

        foreach (FieldInfo field in fields)
        {
            if (!IsSerializable(field))
                continue;

            info.AddValue(field.Name, field.GetValue(this));
        }
    }

    protected bool IsSerializable(FieldInfo info)
    {
        object[] attributes = info.GetCustomAttributes(typeof(SerializableProperty), false);

        if (attributes.Length == 0)
            return false;

        return true;
    }

「SerializableProperty」は、シリアル化するフィールドに設定した空の属性です。

どのシリアライザーについては、完全にあなた次第です。XMLは、後で読んだり編集したりできるので便利です。ただし、複雑な構造や大きな構造の場合にファイルサイズを小さくするBinaryFormatterを使用しました。

于 2012-10-16T11:34:19.997 に答える