5

私のアプリでは、ユーザーが必要に応じて多くのアイテムを発見できるため、バイナリシリアライザーを探しています。ユーザーが 100 を超えるアイテム (これらのアイテムはインターネットからダウンロードされたもの) を発見し、アプリが中断されたときに、存在しないために最後のアイテムを見つけることができないとします。

アプリでは、常に最初の 10 項目を読み込むため、これが発生します。しかし、メトロの原則では、アプリはすべてを復元する必要があると言われています..そのため、バイナリシリアライザーを使用してこのオブジェクトを迅速に保存することを考えていました。しかし、私を助けることができるクラスが見つかりません。

編集:

public abstract class BaseItem
{
    ...

    public BaseGroup Group { get; set;}
}

public abstract class BaseGroup
{
    public IEnumerable<BaseItem> Items { get; set; }
}

public sealed class FeedDataGroup
{
    ...
}

public sealed class FeedItem
{
    ...
}

ObservableCollection をシリアル化する予定です。JSON を使用する場合、クラスの構造に問題はありますか?

4

4 に答える 4

6

Microsoft のサンプル コードは DataContractSerializer を使用しています

        // Serialize the session state synchronously to avoid asynchronous access to shared
        // state
        MemoryStream sessionData = new MemoryStream();
        DataContractSerializer serializer = new DataContractSerializer(typeof(Dictionary<string, object>), _knownTypes);
        serializer.WriteObject(sessionData, _sessionState);

        // Get an output stream for the SessionState file and write the state asynchronously
        StorageFile file = await ApplicationData.Current.LocalFolder.CreateFileAsync(sessionStateFilename, CreationCollisionOption.ReplaceExisting);
        using (Stream fileStream = await file.OpenStreamForWriteAsync())
        {
            sessionData.Seek(0, SeekOrigin.Begin);
            await sessionData.CopyToAsync(fileStream);
            await fileStream.FlushAsync();
        }
于 2012-07-20T21:32:45.373 に答える
2

System.Runtime.Serialization には、説明したことを行うBinaryFormatterクラスがあります。特に WinRT の経験はありませんが、このクラスは .Net 4.5 で利用できるので、利用できると信じています。

以下の批判は公正です。上記の .Net 4.5 の後に「コア」という言葉を省略しただけでなく (メッセージの意味をかなり大幅に変更しました)、System.Runtime.Serialization の他のメンバーが.Net 4.5 Coreにしました。4.5 と core の相違点のリストを見ると、 BinaryFormatter が具体的に除外されていることがわかります。

于 2012-07-20T18:57:10.437 に答える
0

オプションは、バイナリ シリアライゼーション用のSharpSerializerです。その使用法は非常に簡単です。

于 2014-08-22T12:51:16.670 に答える
0

using System.Runtime.Serialization.Json 名前空間には、必要に応じて JSON にシリアル化する Json シリアライザーがあります。シリアライザーを使用するには、データ契約としてシリアライズされるデータをマークする必要があります

[DataContract]
public class Serializable
{
   [DataMember]
   Public string SerializableMember{get;set;}

   Public string NonSerializedMember{get;set;}
}

DataContractJsonSerializer を使用して、オブジェクトを JSON ストリームにシリアル化できるようになりました。作成される JSON 構造は次のようになります: {"SerializableMember" : {データの値} } クラス情報は保存されませんが、メンバー名と値の両方がクラスのシリアル化可能なメンバーから json オブジェクトに保存されます。JSON は xml よりも少しコンパクトなので、大量のデータ セットに適しています。ARM プロセッサはビッグ エンディアンとリトル エンディアンの両方であり、プログラマはこの問題を制御できないため、Microsoft は Metro から Binary シリアライザを省略したのではないかと思います。

于 2013-01-10T19:51:59.113 に答える