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

这是用于反序列化的构造函数:

        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();

         }

现在,异常消息说可能的原因是无效的流或序列化和反序列化之间的对象版本更改。由于我在序列化和反序列化之间没有接触过我的课程,我猜问题出在流上,它是无效的(或者是别的什么东西!?)。

请有人指出我正确的方向,将不胜感激。:)

4

2 回答 2

1

DateTime 是一个值类。因此,最简单的方法是在 Servis 中使用该 sintax,而不是对 DateTime 使用处理程序

于 2012-12-24T08:10:15.057 回答
0

您的序列化代码示例用于编写日期/时间:

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

但反序列化代码如下:

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

因此,您正在编写一个名称为“Datum osnivanja servisa”的值,但尝试使用名称“Naziv servisa”读回它。

如果您的代码是这样编写的,而不仅仅是您问题中的转录错误,那么它几乎肯定是您的问题的原因。

于 2012-12-24T03:51:18.983 回答