【问题标题】:Why does he deserialize twice为什么他反序列化两次
【发布时间】:2014-10-13 18:27:45
【问题描述】:

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

编辑我添加了其余的方法

【问题讨论】:

  • 天哪,为什么你/谁在使用goto....
  • 他被解雇了对吧?他第二次反序列化后的代码是否与原始工作流程完全相同?可以像复制粘贴问题一样简单。只是看起来像一个疏忽,没有真正的原因。任何答案都是纯粹的假设。
  • 基本上,这是因为他是一个糟糕的程序员。那是不必要的代码,goto 只是加强了我的假设。
  • 这应该直接转到codecrap.com
  • 您的编辑清楚地表明他正在检查原始对象与更改后的对象。这就是两个反序列化调用的原因。

标签: c# serialization deserialization binary-serialization


【解决方案1】:

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

【讨论】:

  • 这就是我缺乏编程知识的问题。我没有意识到改变 dccmcaltered 改变了 dobj。谢谢
  • @JoshDavis 请务必牢记referencesobjects 之间的区别。您可以拥有 3000 个都指向同一个对象的引用。如果您通过这些引用中的 any 更改该对象:更改将从其余部分可见。毕竟,只有一个对象
  • 我又缺乏知识。我以为他创建了一个 dccmcaltered 对象,然后将其成员与 dobj 设置为 ASM001。我在想它是 dobj 的副本而不是参考
【解决方案2】:

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

很高兴我不必维护它... 祝你好运!

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

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

【讨论】:

    【解决方案3】:

    因为他正在用dccmcaltered.ObjectLocation = wpuiobj.ObjectLocation; 之类的行更改第一个反序列化对象dobj,所以他丢失了“原始”dccmcaltered.ObjectLocation 值并通过第二次反序列化将它们“恢复”(到另一个对象中)......奇怪的家伙......干杯

    【讨论】:

      猜你喜欢
      • 2011-02-03
      • 2020-01-02
      • 1970-01-01
      • 2022-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-17
      相关资源
      最近更新 更多