Pregunta

creé hace una aplicación .NET años sin pensar demasiado en el formato de archivo: utiliza un formateador de jabón para serializar nuestra gran jerarquía de objetos. Era la suciedad fácil de hacer, y por eso no le dio mucha importancia.

Ahora estoy tratando de llegar a un formato de archivo más óptima teniendo en cuenta el problema siguiente: Cuando se guarda un archivo, se termina siendo convertida en matriz de bytes y conseguir enviado a través del cable a una base de datos para el almacenamiento. Esto termina siendo un gran problema, ya que tiene todos sus objetos en la memoria, entonces se puede asignar más memoria para el serializador, y luego asignar más memoria para la matriz de bytes. Incluso gráficos de objetos de tamaño modesto terminan usando una gran cantidad de memoria para tomar el cuidado de guardar el archivo.

No estoy seguro de cómo mejorar esto, tanto desde una perspectiva formato de archivo, pero también, potencialmente, desde la perspectiva del algoritmo (objetos -> corriente -> matriz de bytes)

Actualizar Yo siempre había sido Comprimir a la matriz de bytes antes de enviarlo a través del cable, por lo que mientras que es un buen consejo, que ya se llevó a cabo en mi solicitud.

Lo hice convertir de jabón a binario serialización, y eso ha hecho una gran diferencia: nuestros archivos son aproximadamente 7 veces más pequeño que antes. (Su kilometraje puede variar, por supuesto).

¿Fue útil?

Solución

Si necesita serialización eficiente, y no le importa si su serializado como un formato binario, sólo tiene que utilizar la serialización binaria estándar en .NET. Usted sólo puede decorar sus tipos serializables con el atributo [Serializable] y utilice el BinaryFormatter para serializar los objetos a byte [].

Otros consejos

BinaryFormatter + DeflateStream = comprimido persistentes de Objetos

using System;
using System.IO;
using System.IO.Compression;
using System.Runtime.Serialization.Formatters.Binary;

namespace CompressedSerialized
{
    class Program
    {
        static void Main(string[] args)
        {
            var obj1 = new MyObject() { Prop1 = "p1", Prop2 = "p2" };
            MyObject obj2 = null;
            var bin = new BinaryFormatter();
            byte[] buffer = null;

            using (var ms = new MemoryStream())
            {
                using (var zip = new DeflateStream(ms, CompressionMode.Compress))
                {
                    bin.Serialize(zip, obj1);
                    zip.Flush();
                }
                buffer = ms.ToArray();
            }

            using (var ms = new MemoryStream(buffer))
            using (var unzip = new DeflateStream(ms, CompressionMode.Decompress))
            {
                var des = bin.Deserialize(unzip);
                obj2 = des as MyObject;
            }

        }
    }

    [Serializable]
    public class MyObject
    {
        public string Prop1 { get; set; }
        public string Prop2 { get; set; }
    }
}

una solución muy rápida si no se ha probado. No va a reducir por completo la cabeza, pero ayudará.

Cuando serializa los objetos, utilice atributos en lugar de nodos. Hay una gran cantidad de espacio desperdiciado mediante nodos. Esto se puede hacer fácilmente esto añadiendo una etiqueta [XmlAttribute] encima de la propiedad / campo.

Referencia link: http://msdn.microsoft .com / es-es / library / 2baksw0z (VS.71) .aspx

También podría tratar de usar un flujo comprimido / comprimido, creo que de la memoria SharpZipLib le permite crear transmisiones comprimidas.

¿Por qué no mover la aplicación lejos de XML a un JSON? Hay una serie de librerías que pueden serializar / deserializar JSON en .NET.

He utilizado LZMA para la compresión de los datos que almacena la base de datos. Por ejemplo hacer las cosas de 36.000 a 6000. Es muy simple de usar, y usted no tiene que tener los datos almacenados al igual que un binario, podría ser también una cadena.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top