2012-07-04 14 views
8

Speichern von Daten in Azure Table Services über TableServiceEntity Sie sind auf die üblichen Basistypen (int, string, datetime usw.) beschränkt, die public get/set haben.Azure TableServiceEntity - Speichern von komplexen Klassen

Es ist keine der üblichen Magie, die Sie gekommen sind, von Serialisierung zu erwarten, die mit Sammlungen befaßt, komplexen Typen, Vererbung usw.

Verschiedene Arten des Umgangs mit diesem in

  • Anspannen sein könnten die WritingEntity and ReadingEntity Ereignisse, um Eigenschaften manuell festzulegen (inc, die sich mit komplexen Typen beschäftigt, die eine Serialisierungsmethode zu einer einfachen Zeichenfolgeneigenschaft verwenden).
  • Ähnlich wie oben, aber eine zusätzliche ‚Speicherklasse‘ verwenden, um zwischen Yourclass übersetzen < -> YourClassStorage < -> TableServices
  • einen Rahmen wie Lokad.Cloud's FatEntities oder Lucifure Mit

ich etwas verpasst haben? Welche Methode mag unter welchen Umständen am besten sein?

Antwort

5

Die Vererbung wird vom ATS unterstützt. Alle geerbten Eigenschaften in der realisierten konkreten Klasse werden beibehalten und abgerufen. Komplexe Typen werden jedoch nicht unterstützt.

Es gibt mindestens eine weitere Möglichkeit, die Persistenz von Objektbäumen und Objektbeziehungen zu behandeln: Speichern Sie verwandte Objekte separat unter einem anderen PartitionKey/RowKey.

Die einfachste Methode (Brute-Force-Methode) zur Implementierung dieses Ansatzes erfordert möglicherweise, dass Sie mehrere Aufrufe an ATS vornehmen, damit Sie Objekte ordnungsgemäß deserialisieren können.

Wenn die Anzahl der Transaktionen für den Speicher wichtiger ist als der belegte Speicherplatz und die Bandbreite, wäre eine elegantere Erweiterung dieses Ansatzes die Implementierung von Schnittstellen für Ihre Entitäten und die Erstellung einer "breiten" Unionsentität, die all diese implementiert Schnittstellen - und das ist der Typ, der gespeichert und abgerufen wird. Jedes Union-Objekt, das abgerufen wird, wird nur über eine bestimmte Schnittstelle verwendet. Auf diese Weise können Sie sowohl Sammlungen als auch einfach verbundene Entitäten speichern. Stellen Sie einfach sicher, dass der PartitionKey für alle Benutzer identisch ist, die mit dem Union-Objekt verknüpft sind, und Sie können ermitteln, welches Union-Objekt welchen Entitätstyp darstellt.

HTH

3

Ich bin mir nicht sicher, ob dies Ihre Frage beantwortet, aber wenn Sie komplexe Typen laden brauchen Sie nur die Daten in ein Byte-Array serialisiert.

Ich musste eine Liste von KeyValuePairs zu TableStorage hochladen, also habe ich einfach einen binären Formatierer verwendet, um es zu einem Bytearray zu serialisieren, dann deserialisieren und es zurückwerfen, wenn es es zurückholt.

Serialize:

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

Deserialize und zurückgeworfen:

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; 
+0

Dank Shahin - ich bedeckt, dass auf "Einhaken in die WritingEntity und ReadingEntity Ereignisse", aber ich denke, man könnte auch tun es einfach zu eine schreibgeschützte byte [] -Eigenschaft und lassen Sie Read/WriteEntity allein – Ryan

Verwandte Themen