2012-12-24 42 views
0

我想學習如何做二進制序列化。二進制流損壞的可能原因是什麼?

此異常被拋出每次我試圖反序列化我以前序列化的對象時間:

Binary stream '161' does not contain a valid BinaryHeader. Possible causes are invalid 
stream or object version change between serialization and deserialization. 

這是我的類的頭:

[Serializable] 
    public ref class Servis{ 
     String ^_nazivServisa; 
     DateTime ^_datumOsnivanjaServisa; 
     double _popustZaStalneKlijente;   
     [NonSerialized] List<Izvjestaj ^> ^_izvjestaji; 
     [NonSerialized] List<StalniKlijent ^> ^_stalniKlijenti; 
     [NonSerialized] List<Vozilo ^> ^_poznataVozila; 

這是GetObjectData方法,設置爲公開在同一類中:

  virtual void GetObjectData(SerializationInfo^ info, StreamingContext context){ 
       info->AddValue("Naziv servisa", _nazivServisa); 
       info->AddValue("Datum osnivanja servisa", _datumOsnivanjaServisa->ToString()); 
       info->AddValue("Popust za stalne klijente", _popustZaStalneKlijente); 
      } 

這是構造函數用於deseria補腎中藥:

 protected: 
     Servis(SerializationInfo ^info, StreamingContext context){ 
       _nazivServisa = info->GetString("Naziv servisa"); 
       _datumOsnivanjaServisa = Convert::ToDateTime(info->GetString("Popust za stalne klijente")); 
       _popustZaStalneKlijente = info->GetDouble("Popust za stalne klijente"); 
       _izvjestaji=gcnew List<Izvjestaj ^>; 
       _stalniKlijenti = gcnew List<StalniKlijent ^>; 
       _poznataVozila = gcnew List<Vozilo ^>; 
      } 

這是代碼中,我試圖打開一個文件,反序列化的塊;如果不存在新的對話框顯示文件輸入一些數據,然後將文件進行序列化現在

  BinaryFormatter ^b = gcnew BinaryFormatter; 
     try{ 
      FileStream ^fs = gcnew FileStream("..\\Datoteke\\Servis.dat", FileMode::Open);    
      _servis = dynamic_cast<Servis ^>(b->Deserialize(fs)); 
      fs->Close(); 
      } 
     catch(FileNotFoundException ^exc){ 
      KreirajServis(); 
      try{ 
       FileStream ^fs = gcnew FileStream("..\\Datoteke\\Servis.dat", FileMode::Create);      
       b->Serialize(fs, _servis); 
       fs->Close(); 
       } 
      } 
      } 


private: void KreirajServis(){ 
     PrvoPokretanje ^p = gcnew PrvoPokretanje(); 
     p->ShowDialog(); 
     _servis=p->dajServis(); 

     } 

,異常消息說,可能的原因是序列化之間無效流或對象版本更改反序列化。 因爲我沒有在序列化和反序列化之間觸及我的類,所以我猜測問題出在流,它是invalit(或者是別的!)。

有人請指點我在正確的方向,這將不勝感激。 :)

+1

嗯,它看起來像你沒有實現ISerializable接口: 公共ref class Servis:公共ISerializable。如果沒有這個,BinaryFormater將不會調用你的GetObjectData方法。 – Emran

+0

那麼,你是對的,好先生:)非常感謝你。 – irfanka

回答

0

您的序列化的代碼示例有這樣寫的日期/時間:

info->AddValue("Datum osnivanja servisa", _datumOsnivanjaServisa->ToString()); 

但反序列化代碼讀取:

_datumOsnivanjaServisa = Convert::ToDateTime(info->GetString("Naziv servisa")); 

所以你寫一個值的名稱「Datum osnivanja servisa」,但試圖用名字「Naziv servisa」讀回它。

如果這就是您的代碼編寫方式,而不僅僅是您的問題中的轉錄錯誤,那麼這幾乎肯定是您的問題的原因。

+0

我向你保證,這不是微不足道的。複製粘貼時發生此錯誤。 無論如何,我解決了這個問題,仍然存在同樣的問題。 :S – irfanka

1

DateTime是一個值類。所以最簡單的方法是在Servis中使用該sintax並使用處理函數來DateTime

+0

這也是我的第一個想法,所以我嘗試在[DateTime]之前放置[NonSerialized] - 沒有奏效。 – irfanka

相關問題