51

オブジェクトをXml文字列に書き込み、その文字列を取得してDBに保存しようとしています。しかし、最初に文字列を取得する必要があります...

    private static readonly Encoding LocalEncoding = Encoding.UTF8;

    public static string SaveToString<T> (T settings)
    {
        Stream stream = null;
        TextWriter writer = null;
        string settingsString = null;

        try
        {
            stream = new MemoryStream();

            var serializer = new XmlSerializer(typeof(T));

            writer = new StreamWriter(stream, LocalEncoding);

            serializer.Serialize(writer, settings);

            var buffer = new byte[stream.Length];

            stream.Read(buffer, 0, (int)stream.Length);
            
            settingsString = LocalEncoding.GetString(buffer);
        }
        catch (Exception ex)
        {
            // If the action cancels we don't want to throw, just return null.
        }
        finally
        {
            if (stream != null)
                stream.Close();

            if (writer != null)
                writer.Close();
        }

        return settingsString;
    }

これは機能しているようで、ストリームはバイトでいっぱいになります。しかし、それをバッファに読み戻し、次に文字列に読み戻すと、バッファは「0」でいっぱいになります。私がここで何を間違えているのかわからない。

4

4 に答える 4

85

の結果をチェックした場合stream.Read、ストリームを巻き戻していないため、何も読み取っていないことがわかります。(これは で実行できますstream.Position = 0;。)ただし、次のように呼び出す方が簡単ですToArray

settingsString = LocalEncoding.GetString(stream.ToArray());

stream( の型をからStreamに変更する必要がありますが、MemoryStream作成したメソッドと同じなので問題ありません。)

または、さらに簡単StringWriterに、代わりに を使用してStreamWriterください。UTF-16 の代わりに UTF-8 を使用する場合は、サブクラスを作成する必要がありますが、それは非常に簡単です。例については、この回答を参照してください。

ところで、何もログに記録することなく、それが無害なものを意味することを単にキャッチExceptionして想定している方法が心配です。一般に、ステートメントは明示的なブロックをusing記述するよりもクリーンであることに注意してください。finally

于 2012-05-04T09:30:16.953 に答える