2013-04-02 25 views
6

Próbuję deserializować obiekt, który zapisałem, do pliku (z Binary Formatter). Cokolwiek próbuję, pojawia się wyjątek: Koniec Stream napotkał przed parsowanie zostało zakończoneFormatriformer deserialize daje: Koniec strumienia napotkanego przed zakończeniem parsowania

Mam następujące linie kodu:

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; 
} 

Próbowałem również:

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; 
} 

Ale co ja do, zawsze uzyskać wyjątek:

Koniec strumienia napotkanego przed zakończeniem przetwarzania

ADDITION: Właśnie zrobiłem kilka dodatkowych testów. Jeśli mam prosty obiekt, tylko kilka właściwości, działa dobrze. Używanie większego (dużego) złożonego obiektu, posiadającego inne obiekty, wyliczenia itp., Jest wtedy, gdy otrzymuję wyjątek.

Odpowiedz

1

Spróbuj ustawić position do 0 do swojego strumienia, wewnątrz drugiego bloku try/catch:

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

ja już nie, nie pomaga, wciąż daje wyjątek. – royu

0

próbowałeś deserializacji filestream raczej niż MemoryStream? to działa dla mnie.

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

pozdrowienia

0

Każdy członek obrębie klasy do serializacji, musi mieć atrybut [Serializable()] lub być oznaczone [NonSerialized]. Uwaga, wyliczenia i wszystkie proste typy wbudowane są już przekształcalne do postaci szeregowej i nie wymagają atrybutu [Serializable()].

Poniższy przykład podaje ten sam błąd. Odkomentuj kod [Serializable()] powyżej public class B, a deserializacja nastąpi bez błędów.

* Nie można z całą pewnością stwierdzić, czy jest to przyczyną błędu, ponieważ nie podano próbki klasy powodującej błąd.

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