他为什么要反序列化两次

时间:2014-10-13 18:27:45

标签: c# serialization deserialization binary-serialization

这不是我的代码,我只需了解它。无法联系到原始程序员。 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]");

修改我添加了方法的其余部分

3 个答案:

答案 0 :(得分:4)

  

为什么在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分配了不同的对象后,这些更改仍可访问。

答案 1 :(得分:2)

稍后他会想要比较未更改的版本和更新的版本。 首先,他将反序列化为dccmcaltered,并设置一些属性。 然后他将反序列化为dccmcoriginal而不设置这些属性。

很高兴我不必保持这个...... 祝你好运!

是的,比较是(aargh): bResult = Generics.IO.SerializerPlus.IsBinaryEqual(dccmcoriginal,dccmcaltered);

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

答案 2 :(得分:0)

因为他首先用dobj这样的行改变反序列化的对象dccmcaltered.ObjectLocation = wpuiobj.ObjectLocation;,所以他输掉了#34;原来的" dccmcaltered.ObjectLocation值和"恢复"他们(进入另一个对象)进行第二次反序列化......奇怪的人......干杯