2012-07-04 17 views
8

Almacenamiento de datos en Azure Table Services a través de TableServiceEntity está limitado a los tipos básicos habituales (int, string, datetime, etc.) que tienen get/set público.Azure TableServiceEntity - almacenamiento de clases complejas

no hay nada de la magia habitual que ha llegado a esperar de serialización que se ocupa de las colecciones, tipos complejos, herencias etc.

diferentes maneras de tratar con esto podría ser

  • enganchar en los eventos WritingEntity and ReadingEntity para establecer manualmente las propiedades (inc que trata con tipos complejos que usan algún método de serialización para la propiedad de cadena simple).
  • Similar al anterior, pero el uso de una 'clase de almacenamiento' adicional para traducir entre YourClass < -> YourClassStorage < -> TableServices
  • El uso de un marco como el Lokad.Cloud's FatEntities o Lucifure

¿Me he perdido algo? ¿Qué método puede ser mejor en qué circunstancias?

Respuesta

5

La herencia es compatible con el ATS. Todas las propiedades heredadas en la clase concreta realizada serán persistentes y recuperadas. Sin embargo, los tipos complejos no son compatibles.

Hay al menos una forma más de tratar con la persistencia de los árboles de objetos y las relaciones entre objetos: Almacene los objetos relacionados por separado bajo una PartitionKey/RowKey diferente.

La manera más simple (fuerza bruta) de implementar ese enfoque puede requerir que realice múltiples llamadas a ATS, para que pueda deserializar objetos correctamente. Si el número de transacciones realizadas contra el almacenamiento es más importante que el espacio de almacenamiento y ancho de banda utilizado, una extensión más elegante de ese enfoque sería implementar interfaces para sus entidades y crear una entidad de Unión "amplia" que implemente todos aquellos interfaces, y ese es el tipo que se almacena y recupera. Cada objeto de la Unión que se recupera se utiliza solo a través de una interfaz particular. Puede almacenar colecciones así como entidades simplemente relacionadas de esta manera: simplemente asegúrese de que su PartitionKey sea la misma para todos los que estén relacionados con el objeto Union y tenga una forma de identificar qué objeto Union representa qué tipo de entidad.

HTH

3

no estoy seguro de si esto responde a su pregunta, pero si usted necesita para cargar tipos de complejos que sólo podría serializar los datos en una matriz de bytes.

Necesitaba subir una Lista de KeyValuePair a TableStorage, así que simplemente usé un formateador binario para serializarlo en una matriz de bytes, luego deserializarlo y devolverlo al recuperarlo.

Serialize:

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

Deserialize y echado hacia atrás:

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

Gracias Shahin - Cubrí que en "enganchar en los eventos WritingEntity y ReadingEntity" pero supongo que también podría simplemente hacerlo a una propiedad de solo lectura byte [] y dejar Read/WriteEntity solo – Ryan

Cuestiones relacionadas