我正在尝试学习如何进行二进制序列化。
每次我尝试反序列化之前序列化的对象时都会引发此异常:
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);
}
这是用于反序列化的构造函数:
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();
}
现在,异常消息说可能的原因是无效的流或序列化和反序列化之间的对象版本更改。由于我在序列化和反序列化之间没有接触过我的课程,我猜问题出在流上,它是无效的(或者是别的什么东西!?)。
请有人指出我正确的方向,将不胜感激。:)