2013-04-02 31 views
6

我試圖反序列化我保存到文件(與二進制格式程序)的對象。無論我嘗試,我得到異常:流的末尾遇到解析完成格式化程序反序列化給出:在分析完成之前遇到的流結束

之前,我有以下幾行代碼:

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

我也試過:

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

但無論我做,總是得到例外:

分析完成前遇到的流結束

ADDITION: 我只是做了一些額外的測試。如果我有一個簡單的對象,只有幾個屬性,它工作得很好。使用更多(大)複雜的對象,包含其他對象,枚舉等封裝,這是我得到異常的時候。

回答

1

嘗試設置position0自己的視頻流,第二個try/catch塊內:

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

我已經做到了,沒有幫助,還給出了異常。 – royu

0

你試圖反序列化文件流,而不是將MemoryStream? 它適合我。

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

問候

0

要序列化的類中的每一個成員,必須具有[Serializable()]屬性或標記[NonSerialized]。請注意,枚舉和所有簡單的內置類型都已經可序列化,並且不需要[Serializable()]屬性。

下面的例子給出了同樣的錯誤。取消之上的[Serializable()]的註釋,並且反序列化將發生而沒有錯誤。

* 不可能肯定地說這是否是您錯誤的原因,因爲您沒有提供導致錯誤的類的示例。

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

相關問題