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 のみを使用してオブジェクト グラフをモデル化できることはわかっていますが、よりクリーンなソリューションを望んでいます。また、独自のシリアル化コードを作成することも避けたいと考えています。
サブ質問:
- 独自のデシリアライザーを作成せずに、iOS および Android で DataContract シリアライゼーションをデシリアライズする方法はありますか
- iOS および Android 用の OData クライアントはオブジェクト参照を保持しますか? 彼らは扱いやすいですか
- Mono for iOS と Mono for Android は、オブジェクト参照を維持しながら DataContract デシリアライゼーションをサポートしますか?
御時間ありがとうございます。