c# exception binary formatter

c# - el formateador deserialize da: Fin del flujo encontrado antes de que se completara el análisis



exception binary (3)

Intenta establecer la position en 0 para tu transmisión, dentro del segundo bloque try / catch:

BinaryFormatter b = new BinaryFormatter(); s.Position = 0; return (YourObjectType)b.Deserialize(s);

Estoy intentando deserializar un objeto que guardé en un archivo (con el formateador binario). Cualquier cosa que intento, obtengo la excepción: Fin de flujo encontrado antes de que se completara el análisis

Tengo las siguientes líneas de código:

public static T DeserializeFromBinaryFile<T>(string fileName) { T instance = default(T); FileStream fs = new FileStream(fileName, FileMode.Open); try { BinaryFormatter formatter = new BinaryFormatter(); instance = (T)formatter.Deserialize(fs); } catch{} finally { fs.Close(); } return instance; }

También probé:

public static T DeserializeFromBinaryFile<T>(string fileName) { T instance = default(T); FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read); MemoryStream ms = new MemoryStream(); try { byte[] bytes = new byte[fs.Length]; fs.Read(bytes, 0, (int)fs.Length); ms.Write(bytes, 0, (int)fs.Length); ms.Position = 0; ms.Seek(0, SeekOrigin.Begin); } catch { } try { BinaryFormatter formatter = new BinaryFormatter(); instance = (T)formatter.Deserialize(ms); } catch { } finally { ms.Close(); fs.Close(); } return instance; }

Pero haga lo que haga, siempre obtenga la excepción:

Fin de flujo encontrado antes de que se completara el análisis

ADICIÓN : Acabo de hacer algunas pruebas adicionales. Si tengo un objeto simple, solo unas pocas propiedades, funciona bien. Usando un objeto más grande (más grande), teniendo encapsulados otros objetos, enumeraciones, etc., es cuando obtengo la excepción.


¿Has intentado deserializar el filestream en lugar del memorystream? esto funciona para mi.

FileStream fs = new FileStream(fileName, FileMode.Open); fs.position=0; instance = (T)formatter.Deserialize(fs);

Saludos


Todos los miembros de la clase a serializar deben tener el atributo [Serializable()] o estar marcados como [NonSerialized] . Tenga en cuenta que las enumeraciones y todos los tipos simples incorporados ya son serializables y no requieren el atributo [Serializable()] .

El siguiente ejemplo da el mismo error. Quite la marca de la public class B [Serializable()] , y la deserialización se producirá sin errores.

* No es posible decir con certeza si esta es la causa de su error, porque no proporcionó una muestra de la clase que dio como resultado el error.

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.IO; using System.Runtime.Serialization; using System.Runtime.Serialization.Formatters.Binary; //[Serializable()] public class B { public int y = 2; } [Serializable()] public class A { public int x = 2; /*[NonSerialized]*/ public B b; public static T DeserializeFromBinaryFile<T>(string fileName) { T instance = default(T); FileStream fs = new FileStream(fileName, FileMode.Open); try { BinaryFormatter formatter = new BinaryFormatter(); instance = (T)formatter.Deserialize(fs); } catch (System.Exception ex) { Console.WriteLine(ex.Message); } finally { fs.Close(); } return instance; } public static void SerializeBinaryFile<T>(string fileName,T t) { try { using (FileStream fs = File.Open(fileName, FileMode.Create)) { BinaryFormatter bf = new BinaryFormatter(); bf.Serialize(fs, t); } } catch (System.Exception ex) { } } } class Program { static void Main(string[] args) { A testA = new A(); A.SerializeBinaryFile("test.dat", testA); A testReadA = A.DeserializeFromBinaryFile<A>("test.dat"); } }

https://msdn.microsoft.com/en-us/library/ms973893.aspx