2011-02-23 7 views
8

Necesito serializar/deserializar obj en/desde byte [] en el framework compacto pero no hay BinaryFormatter, ¿qué debo hacer? Gracias. Esta es la clase que estoy utilizando en el lado del servidor y quiero también en el cliente (un dispositivo con Windows Mobile 6)BinaryFormatter no existe en CF. Soluciones?

public class Serializer 
{ 
    public byte[] SerializeObject(object obj) 
    { 
     if (obj == null) 
      return null; 
     using (MemoryStream stream = new MemoryStream()) 
     { 
      BinaryFormatter formatter = new BinaryFormatter(); 
      formatter.Serialize(stream, obj); 
      return stream.ToArray(); 
     } 
    } 

    public object DeserializeObject(byte[] bytes) 
    { 
     if (bytes == null) 
      return null; 
     BinaryFormatter formatter = new BinaryFormatter(); 
     MemoryStream stream = new MemoryStream(bytes); 
     return formatter.Deserialize(stream); 
    } 
} 

Respuesta

10

Para su escenario, puede considerar cambiar protobuf-net; este no es el mismo formato que BinaryFormatter, por lo que tanto el cliente como el servidor necesitarían ajustes, pero es una API de serialización binaria que funciona en ambas plataformas, y es typically much smaller como un extra adicional. El formato es en realidad la codificación de "búferes de protocolo" de Google; muy rápido, independiente de la plataforma y diseñado para ser flexible a medida que agrega propiedades, etc. Y es gratis. Un tonto simplemente lo regala.

+0

¡¿Qué clase de tonto regalaría tales cosas ?! ¡Herejía! – ctacke

+0

Repartirlo es lo único que puede hacer para sentir que está haciendo del mundo un lugar mejor. Ese tonto probablemente trabaje en un trabajo sin futuro para un gerente que da requisitos como "Make it Awesome" y está obsesionado con ponys o algo así. Si solo trabajara en algo que facilitara el trabajo de los programadores ... :) – kemiller2002

0

De Differences between the .NET Compact Framework and the .NET Framework de MSDN:

serialización

Debido a consideraciones de tamaño y rendimiento, .NET Compact Framework no es compatible con la serialización binaria utilizando BinaryFormatter o la serialización SOAP utilizando SoapFormatter.

Sin embargo, .NET Compact Framework proporciona soporte de serialización para transmitir datos de objetos mediante el uso de SOAP en servicios web XML y serialización de conjuntos de datos a XML.

3

Originalmente utilizamos el As Good As It Gets Compact Framework Serialization que es completamente compatible con binarios con el framework completo BinaryFormatter pero la licencia por dispositivo fue un factor decisivo. Dependiendo de la cantidad de dispositivos que necesite admitir, puede funcionar para usted. También descubrimos que BinaryFormatter tenía una sobrecarga de memoria y tiempo, no muy cercana al costo de SoapFormatter, pero aún significativa para un dispositivo CE.

Al final, creamos un marco de serialización usando BinaryWriter y BinaryReader directamente junto con System.Activator para crear las clases. Esto nos permitió eliminar gran parte de la sobrecarga de memoria y tiempo asociada a la serialización incorporada a costa de una cuidadosa versión de los objetos y el orden de los campos. Cabe señalar que nuestro trabajo de serialización personalizado era anterior al lanzamiento de protbuf.net.

Cuestiones relacionadas