2010-07-15 10 views
5

Me enfrenta el siguiente problema. Necesito (de) serializar (binario) una secuencia de objetos en un único archivo en el disco. La parte de serialización no es un problema, solo abra una secuencia en modo de adición y use el método Serialize BinaryFormatter de .Net y listo. El problema con este enfoque es que no puedo simplemente dar este flujo a la función de deserialización de BinaryFormatter, lo que contiene no es una sola instancia del objeto que he serializado.Binario (De) Serialización de una secuencia de objetos a 1 archivo

¿Existe una solución común a este problema? Todos los objetos serializados en una secuencia dada son del mismo tipo, por lo que al menos no necesitamos averiguar qué se debe deserializar, eso es un hecho, pero no parece sugerir una salida a esto.

Aclaración sobre la base de las respuestas: El número de objetos enviados en el que se espera sea grande y por lo tanto es inviable para mantener a todos en una colección de envoltura (como el lavado en el disco requeriría para cargar todos ellos en la memoria -> agregue los nuevos -> flush to disk).

  • Normalmente al serializar un objeto aparece un archivo que contiene:

[Objeto]

  • lo que estoy creando es un archivo que contiene:

[Objeto] [Objeto] [Objeto] [Objeto] ... [Objeto]

Y necesito deserializar las instancias de Objeto individuales.

¡Gracias de antemano!

Respuesta: Dado que la respuesta es aludido en este hilo (con suficiente claridad), pero nunca se indica explícitamente, pensé voy a decirlo aquí:

while (fileStream.Position < fileStream.Length) 
    messages.Add((Message)formatter.Deserialize(fileStream)); 

El BinaryFormatter se deserializar un objeto cada vez que lo desee :) Es posible que desee almacenar en caché la propiedad fileStream.Length, ya que la longitud parece volver a calcularse cada vez que llama a la propiedad, ralentizando las cosas. No tengo idea de por qué eso no funcionó la primera vez que lo intenté antes de publicar esta pregunta, pero funciona sin problemas ahora.

Respuesta

1

Trate de poner los objetos en una colección serializable (creo que la lista es serializable), entonces (de) serializar que objeto

EDITAR en respuesta a una aclaración: Me acabo de dar cuenta que esta cuestión tiene la misma respuesta como este question. En lugar de tratar de reinventar una respuesta, que acababa de echar un vistazo a la respuesta de la marca Gravell, o para this one

+0

los objetos se transmiten durante la vida útil del sistema y hay una gran cantidad de ellos esperados , Necesito enjuagarmeAl mantenerlos en wrapper-collection tendré que mantenerlos todos en la memoria y volver a escribir todo el archivo cada vez que quiera descargar al disco. – United

+0

la primera sugerencia no funciona, a causa de necesitar otra biblioteca (también conocido como proceso de aprobación de 6 meses a través de legal, si tengo suerte). El segundo es intrigante. Para la segunda respuesta, parece que tienen la serialización normal para deserializar la serie de objetos de un archivo sin que esos objetos estén en la colección. En mis pruebas eso no funcionó, así que supongo que trataré de investigar más a fondo + tal vez el seguimiento en esa pregunta SO. – United

0

Un archivo es una serialización, así que pensaría de enviar el flujo directamente a un archivo haría lo que parece querer. Una explicación más específica de su situación ayudaría, para proporcionar una respuesta más útil. (Me gustaría poder ingresar esto como un 'comentario', pero de alguna manera el botón de comentario no está disponible para mí.)

+0

Serialización no es el problema. El problema es que si serializo un objeto a la vez (lo cual debo) y los anexo a una secuencia, no puedo deserializar la secuencia resultante, porque toda la secuencia no representa un solo objeto. – United

+0

Básicamente, normalmente cuando serializa un objeto a un archivo, el archivo contendrá ese único objeto (es decir, [Objeto]) para deserializarlo Objeto obj = binaryFormatter.Deserialize (fs, MyObjType); Lo que tengo es un archivo de la forma [Objeto] [Objeto] ... [Objeto] así que no puedo simplemente llamar a la función deserializar en este archivo, ya que lo que proporcioné al deserializador no es una serialización de un solo objeto. – United

+0

Lo que estaba pensando es poner algunos delimitadores en él (siempre que exista una combinación de símbolos que un serializador nunca puede producir). De esta forma, puedo analizar manualmente el archivo en fragmentos (que representan un solo objeto serializado) en una secuencia y darles fragmentos a otra secuencia, que a su vez se entrega al deserializador. – United

Cuestiones relacionadas