为什么他反序列化了两次

本文关键字:两次 反序列化 为什么 | 更新日期: 2023-09-27 18:26:20

这不是我的代码,我只需要理解它。无法联系到原始程序员。dobj只是一种对象类型。我的主要问题是:当dobj从未更改时,他为什么要再次反序列化请忽略他所有的goto,因为现在他们在这个程序中无处不在。

        ////////////////////////
        //Deserialize Original//
        ////////////////////////
        dobj = Generics.IO.BinarySerializer.Open(g_PathToTMP);
        if (dobj == null)
        {
            ///////
            //LOG//
            ///////
            goto Label_Done;
        }
        dccmcaltered = dobj as ASM001.MatSettings;
        if (dccmcaltered == null)
            goto Label_Done;
        //
        //////////////////////////////////////////
        //Apply Changes To Deserialized Original//
        //////////////////////////////////////////
        dccmcaltered.ObjectLocation = wpuiobj.ObjectLocation;
        dccmcaltered.ObjectOffset = wpuiobj.ObjectOffset;
        dccmcaltered.UserDefinedLocation = wpuiobj.UserDefinedLocation;
        dccmcaltered.Locked = wpuiobj.Locked;
        dccmcaltered.RinseLocation = wpuiobj.RinseLocation;
        dccmcaltered.RinseDepth = wpuiobj.RinseDepth;
        dccmcaltered.DrainLocation = wpuiobj.DrainLocation;
        dccmcaltered.DrainDepth = wpuiobj.DrainDepth;
        //
        ////////////////////////
        //Deserialize Original//Why did we need to Deserialize again
        ////////////////////////
        dobj = Generics.IO.BinarySerializer.Open(g_PathToTMP);
        if (dobj == null)
        {
            ///////
            //LOG//
            ///////
            goto Label_Done;
        }
        dccmcoriginal = dobj as ASM001.MatSettings;
        if (dccmcoriginal == null)
            goto Label_Done;
        //
        bResult = Generics.IO.SerializerPlus.IsBinaryEqual(dccmcoriginal, dccmcaltered);
        Label_Done:
        ;
        bCurrent = bResult;
        ///////////
        //Cleanup//
        ///////////
        FileInfo fInfo = new FileInfo(g_PathToTMP);
        if (fInfo.Exists)
            fInfo.Delete();
        //
        System.Diagnostics.Debug.WriteLineIf(!bCurrent && g_bVerbose, "[Main] Mat is not Current [ASM = 1]!");
        System.Diagnostics.Debug.WriteLineIf(bCurrent && g_bVerbose, "[Main] Mat is Current! [ASM = 0]");

编辑我添加了方法的其余部分

为什么他反序列化了两次

为什么在dobj从未更改的情况下,他再次反序列化?

dobj引用的对象已被更改。无论您是通过dobj还是dccmcaltered:引用它,它都是相同的对象

dccmcaltered = dobj as ASM001.MatSettings;

这只是得到对相同对象的不同类型的引用

dccmcaltered.ObjectLocation = wpuiobj.ObjectLocation;
dccmcaltered.ObjectOffset = wpuiobj.ObjectOffset;
dccmcaltered.UserDefinedLocation = wpuiobj.UserDefinedLocation;
dccmcaltered.Locked = wpuiobj.Locked;

现在:价值观发生了变化。

请注意,dccmcaltered保留了对该原始对象的引用,因此即使在dobj被分配了不同的对象之后,这些更改仍然可以访问。

稍后他想比较未更改的版本和更新的版本。首先,他反序列化为dccmchanged,并设置一些属性。然后,他在不设置这些属性的情况下反序列化为dccmcurial。

很高兴我不用维护这个。。。祝你好运

是的,比较是(aargh):bResult=泛型.IO.SerializerPlus.IsBinaryEqual(dccmcurial,dccmchanged);

所以你可以删除所有关于dccmcurial的内容,并在实际更改属性之前验证属性是否需要更改。

因为他用类似dccmcaltered.ObjectLocation = wpuiobj.ObjectLocation;的行更改了第一个反序列化的对象dobj,所以他丢失了"原始"dccmcaltered.ObjectLocation值,并用第二个反序列化将它们"恢复"到另一个对象中。。。奇怪的家伙。。。欢呼