我想學習如何做二進制序列化。二進制流損壞的可能原因是什麼?
此異常被拋出每次我試圖反序列化我以前序列化的對象時間:
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(或者是別的!)。
有人請指點我在正確的方向,這將不勝感激。 :)
嗯,它看起來像你沒有實現ISerializable接口: 公共ref class Servis:公共ISerializable。如果沒有這個,BinaryFormater將不會調用你的GetObjectData方法。 – Emran
那麼,你是對的,好先生:)非常感謝你。 – irfanka