为什么他反序列化了两次
本文关键字:两次 反序列化 为什么 | 更新日期: 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
值,并用第二个反序列化将它们"恢复"到另一个对象中。。。奇怪的家伙。。。欢呼