2009-05-03 12 views
6

Tengo un único archivo y necesito serializar varios objetos de la misma clase cuando se crea un objeto nuevo. No puedo almacenarlos en matrices ya que necesito serializarlas la instancia que crea un objeto. Por favor, ayúdame.Tengo un archivo único y necesito serializar varios objetos aleatoriamente. ¿Cómo puedo en C#?

+1

¿Qué quieres decir con randomly? –

+0

Creo que debes aclarar tu inglés. –

+0

¿Está guardando los objetos en ese "único archivo" y recuperándolos de él? Cuando dice que desea "serializar" los objetos tan pronto como se crean, ¿quiere decir que quiere guardarlos en ese único archivo? – DOK

Respuesta

0

Ver la respuesta here.

En resumen, simplemente serialice todo en el mismo flujo de archivos, y luego deserialice. dotNet sabría el tamaño de cada objeto

7

¿Qué mecanismo de serialización está utilizando? XmlSerializer podría ser un problema debido al nodo raíz y cosas como las declaraciones del espacio de nombres, que son un poco difíciles de obtener, además, no es genial en deserializaciones parciales. BinaryFormatter es muy frágil para empezar, no lo recomiendo en la mayoría de los casos.

Una opción podría ser protobuf-net; se trata de un serializador binario (que utiliza el formato de "búferes de protocolo" de Google: eficiente, portátil y tolerante a versiones). Puede serializar varios objetos en una secuencia con Serializer.SerializeWithLengthPrefix. Para deserializar los mismos artículos, Serializer.DeserializeItems devuelve IEnumerable<T> de los artículos deserializados, o puede hacer que TryDeserializeWithLengthPrefix sea público (actualmente es privado, pero la fuente está disponible).

Simplemente escriba cada objeto en un archivo después de haberlo creado, trabajo hecho.

Si quiere un ejemplo, por favor diga que aunque la unidad prueba here, dé una visión general.

Sería básicamente ser algo así como (no probado):

using(Stream s = File.Create(path)) 
{ 
    Serializer.SerializeWithLengthPrefix(s, command1, PrefixStyle.Base128, 0); 
    ... your code etc 
    Serializer.SerializeWithLengthPrefix(s, commandN, PrefixStyle.Base128, 0); 
} 
... 
using(Stream s = File.OpenRead(path)) { 
    foreach(Command command in 
      Serializer.DeserializeItems<Command>(s, PrefixStyle.Base128, 0)) 
    { 
     ... do something with command 
    } 
} 
+0

Sé que llego tarde a la fiesta, pero ¿te importaría explicar * 'BinaryFormatter es muy frágil para empezar, no lo recomiendo en la mayoría de los casos. * * ¿Por qué es frágil? ¿Por qué no lo recomiendas? Ha pasado un tiempo desde esta respuesta. ¿Quizás puedas recomendar otra forma de serializar múltiples objetos en un solo archivo/múltiples archivos? –

+1

@mehow sure: BinaryFormatter es muy intolerante a la versión/refactor: es muy fácil hacer que no pueda deserializar los archivos existentes al cambiar ... bueno, francamente. También depende del marco y de la plataforma, restringiendo las opciones. También es innecesariamente hinchado e ineficiente, y tiene una serie de "errores". En cuanto a su otra pregunta: soy parcial, pero diría que protobuf-net aborda todos estos. Eso fue, después de todo, el objetivo del diseño :) protobuf-net está perfectamente satisfecho con múltiples objetos en una secuencia, siempre que se utilicen los métodos * WithLengthPrefix. –

+0

Gracias, lo aprecio –

0

Por cada objeto que llega, que lo convertirá en una cadena Base64Encoded y almacenarlo como una línea en un archivo de texto. Entonces, en este archivo, cada fila tendrá un objeto serializado por línea. Mientras leemos leeremos el archivo una línea a la vez y deserializaremos esta cadena codificada en Base64 en nuestro Objeto. Fácil ... así que vamos a probar el código.

http://www.codeproject.com/KB/cs/serializedeserialize.aspx?display=Print

Cuestiones relacionadas