0

オブジェクトのメンバーの値のみをファイルにシリアル化する必要がある状況にあります。

たとえば、オブジェクトに 3 つの文字列メンバーが含まれている場合、オブジェクトのバージョン、カルチャ、アセンブリ名など、Binaryformatterが追加するシリアル化メタデータを除いて、シリアル化の出力をこの 3 つの文字列のみにする必要があります。

1 つのオプションは、オブジェクトの各メンバーを直接記述することですが、このようにシリアル化する必要があるクラスがたくさんあり、これをクラスごとに異なる方法で処理する関数を記述したくないため、これを避けたいと考えています。

要件:

任意のタイプのファイルに書き込めるようにしたい。メンバーの値をバイトに変換して (バッファに、または直接ファイルに)、それらのバイトをファイルの特定の位置に書き込めるようにしたい。 .

オブジェクトのメンバーの値のみをシリアル化する方法または API はありますか?

4

2 に答える 2

1

マタン、

これは私がまったく異なる目的のためにまとめたコードですが、未知のオブジェクトを受け取り、それをXMLファイルにシリアル化します(より良いコーディング手法を含むように更新されています)。

    void objectToXMLFile(String fn, object o)
    {
        XmlTextWriter textWriter = new XmlTextWriter(fn, null);

        System.Type type = o.GetType();
        PropertyInfo[] piList = type.GetProperties();

        textWriter.WriteStartDocument();

        textWriter.WriteStartElement("attributeList");

        foreach (PropertyInfo pi in piList)
        {
            textWriter.WriteStartElement("attribute");

            textWriter.WriteStartElement("name");
            textWriter.WriteString(pi.Name);
            textWriter.WriteEndElement();

            textWriter.WriteStartElement("value");
            textWriter.WriteString(pi.GetValue(o).ToString());
            textWriter.WriteEndElement();

            textWriter.WriteStartElement("dataType");
            textWriter.WriteString(pi.PropertyType.Name);
            textWriter.WriteEndElement();

            textWriter.WriteEndElement();
        }
        textWriter.WriteEndElement();
        textWriter.WriteEndDocument();
        textWriter.Close();
    }
于 2013-02-04T20:18:10.717 に答える
0

リフレクションを使用して必要なプロパティのみを書き込むことになった場合は、パフォーマンスへの影響を考慮する必要があります。

リフレクションの使用は遅いです。型自体をリフレクトするとコストが高くなり、呼び出しPropertyInfoによる動的な呼び出しPropertyInfo.GetValueは非常に遅くなります。

別の方法として、プロパティを呼び出してその値を書き込む式ツリーを構築し、この式を .xml ファイルにコンパイルする方法がありActionます。Actionこれらのインスタンスを、シリアライズするオブジェクトのキーを持つディクショナリにキャッシュTypeし、オブジェクトをシリアライズするときに適切なインスタンスを呼び出すことができます。

それははるかに高速であり、GC にそれほど負荷をかけません。

検討できるもう 1 つの方法は、ビルド時のコード生成です。クラスを生成して、ターゲットの型をすばやく安価にシリアル化できます。一部のシナリオでは、これが適切な選択です。

于 2013-02-04T22:03:38.757 に答える