2

Windows 8 Metro アプリ開発でオブジェクトを xml ファイルにシリアル化するにはどうすればよいですか? stream の作成方法がわかりません。streamWriter を作成すると、ファイルの方向でエラーが発生します

StreamWriter nsw = new StreamWriter(@"C:\sample.xml");

エラー: 最適なオーバーロード メソッド マッチ 'system.io.streamwriter..streamwriter(system.io.stream) に無効な引数がいくつかあります

これはメインコードです:

 StorageFolder storageFolder = KnownFolders.DocumentsLibrary;
 StorageFile sampleFile = await storageFolder.CreateFileAsync("sample.xml");
 XmlSerializer serializer = new XmlSerializer(ob.GetType());
 serializer.Serialize(Stream stream,ob);
4

3 に答える 3

2

これが私が使用する例です。Serialize 呼び出し (コードの最後の行) が間違っているようです。

private async void SaveButton_Click(object sender, RoutedEventArgs e)
{
    FileSavePicker fileSavePicker = new FileSavePicker();
    fileSavePicker.DefaultFileExtension = ".bla";
    fileSavePicker.FileTypeChoices.Add("Bla Files", new List<string> { ".bla" });
    fileSavePicker.SuggestedFileName = "New Bla File";
    fileSavePicker.SuggestedStartLocation = PickerLocationId.DocumentsLibrary;
    var file = await fileSavePicker.PickSaveFileAsync();
    if (file != null)
    {
        using (var stream = await file.OpenAsync(FileAccessMode.ReadWrite))
        {
            XmlSerializer serializer = new XmlSerializer(typeof(TypeToBeSerialized));
            serializer.Serialize(stream.AsStreamForWrite(), objectToBeSerialized);
            await stream.FlushAsync();
            stream.Size = stream.Position;
        }
    }
}
于 2012-09-24T09:37:31.713 に答える
1

これは、関連する投稿に投稿したコードのスニペットです。

シリアル化された XML をファイルに書き込む

Windows 8 / RT の Windows Storage を使用して非同期的に XML にシリアル化するには:

/// <summary>
/// Saves the given class instance as XML asynchronously.
/// </summary>
/// <param name="fileName">Name of the xml file to save the data to.</param>
/// <param name="classInstanceToSave">The class instance to save.</param>
public static async void SaveToXmlAsync(string fileName, T classInstanceToSave)
{
    using (var stream = await ApplicationData.Current.LocalFolder.OpenStreamForWriteAsync(fileName, CreationCollisionOption.ReplaceExisting))
    {
        XmlSerializer serializer = new XmlSerializer(typeof(T));
        using (XmlWriter xmlWriter = XmlWriter.Create(stream, new XmlWriterSettings() { Indent = true }))
        {
            serializer.Serialize(xmlWriter, classInstanceToSave);
        }
    }
}

ファイルからのシリアル化された XML の読み取り

Windows 8 / RT の Windows ストレージを使用してシリアル化された XML から非同期的に読み取るには:

/// <summary>
/// Loads a class instance from an XML file asynchronously.
/// </summary>
/// <param name="fileName">Name of the file to load the data from.</param>
public static async System.Threading.Tasks.Task<T> LoadFromXmlAsync(string fileName)
{
    try
    {
        var files = ApplicationData.Current.LocalFolder.GetFilesAsync(Windows.Storage.Search.CommonFileQuery.OrderByName).GetResults();
        var file = files.FirstOrDefault(f => f.Name == fileName);

        // If the file exists, try and load it it's data.
        if (file != null)
        {
            using (var stream = await ApplicationData.Current.LocalFolder.OpenStreamForReadAsync(fileName))
            {
                XmlSerializer serializer = new XmlSerializer(typeof(T));
                T data = (T)serializer.Deserialize(stream);
                return data;
            }
        }
    }
    // Eat any exceptions unless debugging so that users don't see any errors.
    catch
    {
        if (IsDebugging)
            throw;
    }

    // We couldn't load the data, so just return a default instance of the class.
    return default(T);
}

/// <summary>
/// Gets if we are debugging the application or not.
/// </summary>
private static bool IsDebugging
{
    get
    {
#if (DEBUG)
        // Extra layer of protection in case we accidentally release a version compiled in Debug mode.
        if (System.Diagnostics.Debugger.IsAttached)
            return true;
#endif
        return false;
    }
}

どちらのコード スニペットでも、ファイルの先頭に "using Windows.Storage" が必要です。

私にとって、これらはヘルパー関数であるため、静的としてマークされていますが、静的である必要はありません。また、IsDebugging 関数は砂糖専用です。

于 2013-06-11T23:50:12.787 に答える
0

ユーザーにファイルの保存場所を尋ねたくない場合は、オブジェクトをローカル アプリ フォルダーまたはリモート フォルダーに保存できます。このクラスを確認してください: https://github.com/emilpytka/Win8Extensions/blob/master/Win8Extensions/Utils/ApplicationDataSerializer.cs

このクラスの使用例: https://github.com/emilpytka/Win8Extensions/blob/master/Win8Extensions.Test/Utils/ApplicationDataSerializerTest.cs

于 2014-03-06T11:46:20.853 に答える