1

TL;DR; オブジェクト間の参照をコード内のように保持しながら、.NET アプリから一部のデータをシリアル化し、WP、Win8、iOS、および Android で逆シリアル化できるライブラリまたはプロトコルはありますか。つまり、単一のインスタンス X が Y のメンバーであり、 Z Y と Z がデシリアライズされるとき、X オブジェクトは 1 つだけである必要があります。

詳細版:

A が型 B のメンバーを持ち、B の 1 つのインスタンスが A の多くのインスタンスのメンバーになることができる、型 A および B のいくつかのオブジェクトをシリアル化できるようにしたいと考えています。WP、Win8、iOS、およびデータがデシリアライズされるとき、Android と同じ関係を維持する必要があります。残念ながら、現在 Android と iOS でテストすることはできません。

シリアル化メカニズムの要件

  • 逆シリアル化時にオブジェクト参照を保持する
  • デバイスは 3 か月に 1 回のように新しいデータを取得するため、シリアライゼーションのオーバーヘッドはそれほど重要ではありません。
  • オーバーヘッドは重要ではありませんが、同じオブジェクトへの参照が 2 回以上シリアル化されないようにすることが重要です。シリアル化されたデータが非常に大きくなる可能性があるためです。
  • .NET でシリアル化できます。他のプラットフォームでのシリアル化は必要ありません。
  • WP、Win8、iOS、Android でデシリアライズできる


[DataContract(IsReference = true)]
public class A
{
    [DataMember]
    public string Name { get; set; }
    [DataMember]
    public B MemberB { get; set; }
}

[DataContract(IsReference = true)] public class B { [DataMember] public string Name { get; set; } }

オブジェクト グラフの例:


var b1 = new B { Name = "B1" };
var aa = new List { new A { MemberB = b1, Name = "A1" }, new A { MemberB = b1, Name = "A2" } };

DataContract Serialization を使用して、 IsReference = true を DataContract 属性に追加しようとしました。これはデスクトップ .NET と WP の間の魅力のように機能し、Windows 8 でも機能すると思いますが、独自のデシリアライザーを作成せずに iOS と Android で DataContractSerialization をデシリアライズする方法を見つけることさえできませんでした。 . 追加の労力なしで iOS および Android で逆シリアル化を提供するライブラリがあれば、DataContract シリアル化は私にとって完璧です。

また、OData サービスも試しました。OData にはiOS および Android 用のクライアント ライブラリがありますが、期待どおりに動作しますか。エンティティ参照に PK がある場合は保持されるようです。次のようにWPおよび.NETコンソールアプリでテストしました:

DemoService service = new DemoService(new Uri("http://services.odata.org/OData/OData.svc/"));
var productsQuery = (DataServiceQuery<Product>)
                    (from p in service.Products.Expand("Category")
                     where p.Category.ID == 1
                     select p);

productsQuery.BeginExecute(
    (result) =>
        {
            var actualProducts = productsQuery.EndExecute(result).ToList();
            System.Diagnostics.Debug.WriteLine(actualProducts[2].Category == actualProducts[4].Category); //outputs true because both categories are the same
        },
    null);

動作しているように見えますが、テストを正しく行っていますか? iOS および Android クライアントでこのように動作しますか? 私の場合は重すぎるように見えるので、OData は避けたいと思います。

各オブジェクトに ID を与え、その ID のみを使用してオブジェクト グラフをモデル化できることはわかっていますが、よりクリーンなソリューションを望んでいます。また、独自のシリアル化コードを作成することも避けたいと考えています。

サブ質問:

  1. 独自のデシリアライザーを作成せずに、iOS および Android で DataContract シリアライゼーションをデシリアライズする方法はありますか
  2. iOS および Android 用の OData クライアントはオブジェクト参照を保持しますか? 彼らは扱いやすいですか
  3. Mono for iOS と Mono for Android は、オブジェクト参照を維持しながら DataContract デシリアライゼーションをサポートしますか?

御時間ありがとうございます。

4

1 に答える 1

3

私はグーグルのプロトコルバッファを使用します。Objective CやC#など、他の言語用の他の実装があります。

アップデート:

これを行う場合は、Android(MonoDroidを使用)や(iOSのMonoTouch)を含め、あらゆる場所で.NETを使用することから始めます。はい、どのプラットフォームでもC#コードを共有できるようになりました。

シリアル化したい各オブジェクトには、Protocol-Bufferオブジェクトとして定義された同等のオブジェクトがあります。各オブジェクトには、IDとしてシリアル化されたハッシュ値があります。オブジェクト内の各参照は、ハッシュ値として定義されます。

次に、各オブジェクトにいくつかのコードを記述して、その下のオブジェクトをウォークし、プロトコルバッファオブジェクトにシリアル化します。ハッシュ値参照を設定します。

各オブジェクト参照はルックアップされ、オブジェクトが存在しない場合はオブジェクトのディクショナリ(ハッシュ値/アドレス)に格納されます。これもシリアル化されています。これにより、オブジェクトは操作全体で1回だけシリアル化/逆シリアル化されるため、オブジェクトを2回シリアル化する必要がなくなります。これは、辞書内のオブジェクトのアドレスを設定/クリアすることによって行われます。

大したことではない前に、私はこのようなものを書きました。

于 2012-09-04T14:44:39.533 に答える