18

Windows-8でオブジェクトを作成するときに問題が発生しStreamWriterます。通常は、パラメーターとして文字列を渡すだけでインスタンスを作成しますが、Windows 8では、ストリームを受信する必要があることを示すエラーが表示されますが、ストリームに気づきました。は抽象クラスです、xmlファイルを書き込むためのコードは誰か知っていますか?、ところで、シリアル化されたオブジェクトを保存したいので.xmlを使用しています、またはシリアル化されたオブジェクトをファイルに保存する方法を知っている人はいますか?ウィンドウズ8?。

何か案は?

現在Windows8ConsumerPreviewを使用しています

コード:

StreamWriter sw = new StreamWriter("person.xml");

エラー:

The best overloaded method match for 'System.IO.StreamWriter.StreamWriter(System.IO.Stream)' has some invalid arguments

4

2 に答える 2

27

StreamWriterの代わりに、次のようなものを使用します。

StorageFolder folder = ApplicationData.Current.LocalFolder;
StorageFile file = await folder.CreateFileAsync();

using (IRandomAccessStream fileStream = await file.OpenAsync(FileAccessMode.ReadWrite))
{
    using (IOutputStream outputStream = fileStream.GetOutputStreamAt(0))
    {
        using (DataWriter dataWriter = new DataWriter(outputStream))
        {
            //TODO: Replace "Bytes" with the type you want to write.
            dataWriter.WriteBytes(bytes);
            await dataWriter.StoreAsync();
            dataWriter.DetachStream();
        }

        await outputStream.FlushAsync();
    }
}

サンプルの使用については、 WinRTXamlToolkitライブラリのStringIOExtensionsクラスを確認できます。

編集*

上記はすべて機能するはずですが、WinRTでクラスが利用可能になる前に作成されました。これにより、ファイルにテキストを書き込むために呼び出すことができ、同様のメソッドを読み取るFileIOことができるため、上記のソリューションが解決する一般的なシナリオのほとんどが簡略化されます。await FileIO.WriteTextAsync(file, contents)文字列、バイト、文字列のリスト、またはを書き込むか追加しますIBuffers

于 2012-04-24T07:46:39.483 に答える
4

このようなアプリケーション全体で使用できる一般的な静的メソッドを作成できます

 private async Task<T> ReadXml<T>(StorageFile xmldata)
    {
        XmlSerializer xmlser = new XmlSerializer(typeof(List<myclass>));
        T data;
        using (var strm = await xmldata.OpenStreamForReadAsync())
        {
            TextReader Reader = new StreamReader(strm);
            data = (T)xmlser.Deserialize(Reader);
        }
        return data;
    }

    private async Task writeXml<T>(T Data, StorageFile file)
    {
        try
        {
            StringWriter sw = new StringWriter();
            XmlSerializer xmlser = new XmlSerializer(typeof(T));
            xmlser.Serialize(sw, Data);

            using (IRandomAccessStream fileStream = await file.OpenAsync(FileAccessMode.ReadWrite))
            {
                using (IOutputStream outputStream = fileStream.GetOutputStreamAt(0))
                {
                    using (DataWriter dataWriter = new DataWriter(outputStream))
                    {
                        dataWriter.WriteString(sw.ToString());
                        await dataWriter.StoreAsync();
                        dataWriter.DetachStream();
                    }

                    await outputStream.FlushAsync();
                }
            }


        }
        catch (Exception e)
        {
            throw new NotImplementedException(e.Message.ToString());

        }

    }

xmlを書くには、単に

 StorageFile file = await ApplicationData.Current.LocalFolder.CreateFileAsync("data.xml",CreationCollisionOption.ReplaceExisting);
        await  writeXml(Data,file);

xmlを読むには

  StorageFile file = await ApplicationData.Current.LocalFolder.GetFileAsync("data.xml");
      Data =  await  ReadXml<List<myclass>>(file);
于 2013-04-09T14:48:52.257 に答える