8

TableServiceEntityを介してAzureTableServicesにデータを格納すると、パブリックget / setを持つ通常の基本タイプ(int、string、datetimeなど)に制限されます。

コレクション、複合型、継承などを処理するシリアル化に期待する通常の魔法はありません。

これに対処するさまざまな方法は

  • WritingEntityイベントとReadingEntityイベントにフックして、プロパティを手動で設定します(プレーン文字列プロパティへのシリアル化メソッドを使用した複合型の処理を含みます)。
  • 上記と同様ですが、追加の「ストレージクラス」を使用して、YourClass <-> YourClassStorage<->TableServices間で変換します。
  • Lokad.CloudのFatEntitiesLucifureなどのフレームワークを使用する

私は何かを逃したことがありますか?どのような状況でどの方法が最適でしょうか?

4

2 に答える 2

5

継承はATSによってサポートされています。実現された具象クラスのすべての継承されたプロパティは永続化され、取得されます。ただし、複合型は実際にはサポートされていません。

オブジェクトツリーとオブジェクト関係の永続性を処理する方法は少なくとももう1つあります。関連するオブジェクトを、別のPartitionKey/RowKeyの下に個別に格納します。

このアプローチを実装する最も簡単な(ブルートフォース)方法では、オブジェクトを適切に逆シリアル化できるように、ATSを複数回呼び出す必要がある場合があります。

ストレージに対して実行されるトランザクションの数が、使用されるストレージスペースと帯域幅よりも重要である場合、そのアプローチのより洗練された拡張は、エンティティのインターフェイスを実装し、それらすべてのインターフェイスを実装する「ワイド」ユニオンエンティティを作成することです。保存および取得される人。取得される各Unionオブジェクトは、特定のインターフェースを介してのみ使用されます。この方法で、コレクションと単純に関連するエンティティを保存できます。PartitionKeyがUnionオブジェクトに関連するすべてのユーザーで同じであることを確認し、どのUnionオブジェクトがどのエンティティタイプを表すかを識別する方法があることを確認してください。

HTH

于 2012-07-04T18:45:13.597 に答える
3

これがあなたの質問に答えるかどうかはわかりませんが、複雑な型をアップロードする必要がある場合は、データをバイト配列にシリアル化するだけで済みます。

KeyValuePairのリストをTableStorageにアップロードする必要があったので、バイナリフォーマッターを使用してバイト配列にシリアル化し、逆シリアル化して取得時にキャストバックしました。

シリアライズ:

MemoryStream ms = new MemoryStream();
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(ms, keyValuePairList);
byte[] ba = ms.ToArray();

デシリアライズしてキャストバックします。

MemoryStream ms = new MemoryStream(byteArray);
BinaryFormatter bf = new BinaryFormatter();
var obj = bf.Deserialize(ms);

//cast object back to List of KeyValuePair
var keyValuePairList = (List< KeyValuePair<string,string> >)obj;
于 2012-07-05T06:50:07.743 に答える