2012-04-30 15 views
30

Tengo un problema con la serialización usando la secuencia de memoria. Aquí está mi código:Serialización/deserialización con secuencia de memoria

/// <summary> 
/// serializes the given object into memory stream 
/// </summary> 
/// <param name="objectType">the object to be serialized</param> 
/// <returns>The serialized object as memory stream</returns> 
public static MemoryStream SerializeToStream(object objectType) 
{ 
    MemoryStream stream = new MemoryStream(); 
    IFormatter formatter = new BinaryFormatter(); 
    formatter.Serialize(stream, objectType); 
    return stream; 
} 

/// <summary> 
/// deserializes as an object 
/// </summary> 
/// <param name="stream">the stream to deserialize</param> 
/// <returns>the deserialized object</returns> 
public static object DeserializeFromStream(MemoryStream stream) 
{ 
    IFormatter formatter = new BinaryFormatter(); 
    stream.Seek(0, SeekOrigin.Begin); 
    object objectType = formatter.Deserialize(stream); 
    return objectType; 
} 

El error que estoy recibiendo es la siguiente: corriente no es un formato binario válido. Los contenidos iniciales (en bytes) son: bla ...

No estoy seguro de qué está causando el error. Cualquier ayuda sería muy apreciada.

Ejemplo de la llamada:

Dog myDog = new Dog(); 
myDog.Name= "Foo"; 
myDog.Color = DogColor.Brown; 

MemoryStream stream = SerializeToStream(myDog) 

Dog newDog = (Dog)DeserializeFromStream(stream); 
+0

Proporcione el código que está utilizando para llamar a sus métodos. – Fernando

+0

¿Puedes mostrarnos cómo estás usando este código? Es sospechoso que este parámetro se denomine objectType –

+1

No tengo ningún problema al ejecutar su ejemplo de códigos. ¿Tiene otra parte que se ocupe del objeto de transmisión? – Turbot

Respuesta

38

Este código funciona para mí:

public void Run() 
{ 
    Dog myDog = new Dog(); 
    myDog.Name= "Foo"; 
    myDog.Color = DogColor.Brown; 

    System.Console.WriteLine("{0}", myDog.ToString()); 

    MemoryStream stream = SerializeToStream(myDog); 

    Dog newDog = (Dog)DeserializeFromStream(stream); 

    System.Console.WriteLine("{0}", newDog.ToString()); 
} 

Cuando los tipos son así:

[Serializable] 
public enum DogColor 
{ 
    Brown, 
    Black, 
    Mottled 
} 

[Serializable] 
public class Dog 
{ 
    public String Name 
    { 
     get; set; 
    } 

    public DogColor Color 
    { 
     get;set; 
    } 

    public override String ToString() 
    { 
     return String.Format("Dog: {0}/{1}", Name, Color); 
    } 
} 

y los métodos de utilidad son:

public static MemoryStream SerializeToStream(object o) 
    { 
     MemoryStream stream = new MemoryStream(); 
     IFormatter formatter = new BinaryFormatter(); 
     formatter.Serialize(stream, o); 
     return stream; 
    } 

    public static object DeserializeFromStream(MemoryStream stream) 
    { 
     IFormatter formatter = new BinaryFormatter(); 
     stream.Seek(0, SeekOrigin.Begin); 
     object o = formatter.Deserialize(stream); 
     return o; 
    } 
+0

Implemento el código que sugirió ahora y el código arroja esta excepción: Excepción ha sido lanzada por el objetivo de una invocación. Ocurre en la línea objeto o = formateador.Deserializar (secuencia); ¿Qué estoy haciendo mal? – MeM

+0

bien, cometí un terrible error en el constructor Deserialization. Una de las propiedades de mis propiedades estaba incorrecta (es decir ... = info.GetValue ("HereWasWrong_ItWasNonExistingThing", typeof (int));) aquí es un buen enlace para este trabajo, y alguien puede necesitarlo: http://www.codeproject.com/Articles/1789/Object-Serialization-using-C también gracias a Cheeso, la respuesta es buena. – MeM

1

BinaryFormatter puede producir resultados no válidos en algunos casos específicos. Por ejemplo, omitirá los caracteres sustitutos no pareados. También puede tener problemas con los valores de los tipos de interfaz. Lea esto documentation page incluyendo contenido de la comunidad.

Si encuentra que su error persiste, puede considerar usar el serializador XML como DataContractSerializer o XmlSerializer.

Cuestiones relacionadas