1. ホーム
  2. c#

[解決済み] オブジェクトを文字列に直列化する

2022-03-17 09:54:32

質問

Objectをファイルに保存する方法は以下の通りです。

// Save an object out to the disk
public static void SerializeObject<T>(this T toSerialize, String filename)
{
    XmlSerializer xmlSerializer = new XmlSerializer(toSerialize.GetType());
    TextWriter textWriter = new StreamWriter(filename);

    xmlSerializer.Serialize(textWriter, toSerialize);
    textWriter.Close();
}

正直言って、私は書いていません(型パラメータを取る拡張メソッドに変換しただけです)。

今、私はそれが文字列として私に戻ってxmlを与える必要があります(ファイルに保存するのではなく)。 私はそれを調べていますが、私はまだそれを理解していない。

このようなオブジェクトに慣れている人にとっては、本当に簡単なことかもしれないと思いました。 そうでない場合は、いずれ私が解決するつもりです。

どのように解決するのですか?

を使用します。 StringWriter の代わりに StreamWriter :

public static string SerializeObject<T>(this T toSerialize)
{
    XmlSerializer xmlSerializer = new XmlSerializer(toSerialize.GetType());

    using(StringWriter textWriter = new StringWriter())
    {
        xmlSerializer.Serialize(textWriter, toSerialize);
        return textWriter.ToString();
    }
}

注:この場合 toSerialize.GetType() の代わりに typeof(T) を使用すると、XmlSerializer のコンストラクタで使用できるすべてのサブクラスをカバーできます。 T (に由来する型を渡した場合、後者の方法では失敗します。 T .    このステートメントを動機づけるサンプルコードのリンクはこちらです。 XmlSerializer を投げる Exception いつ typeof(T) が使われているのは、派生型の基底クラスで定義されているSerializeObjectを呼び出すメソッドに、派生型のインスタンスを渡すためです。 http://ideone.com/1Z5J1 .

また、Ideoneはコードの実行にMonoを使用しており、実際の Exception Microsoft .NETランタイムを使用した場合の Message Ideoneに表示されているものと同じですが、同じように失敗します。