我有一个对话框,当生成时,它会填充对象模型中的数据。此时,数据被复制并存储在“备份”对象模型中。当用户完成更改并单击“确定”关闭对话框时,我需要一种快速方法将备份对象模型与实时对象模型进行比较 - 如果发生任何更改,我可以为用户创建新的撤消状态。
如果可能的话,我不想为对象模型中的每个类编写比较函数。
如果我序列化两个对象模型并且它们相同但存储在不同的内存位置,它们会相等吗?是否存在一些简单的方法来比较两个序列化对象模型?
我没有考虑哈希字符串,但直接的二进制序列化就可以产生奇迹。当对话框打开时,序列化对象模型。
BinaryFormatter formatter = new BinaryFormatter();
m_backupStream = new MemoryStream();
formatter.Serialize(m_backupStream,m_objectModel);
然后,如果用户使用可用控件(或不使用可用控件)添加到对象模型。当对话框关闭时,您可以将原始序列化与新序列化进行比较 - 对我来说,这就是我决定是否需要撤消状态的方式。
BinaryFormatter formatter = new BinaryFormatter();
MemoryStream liveStream = new MemoryStream();
formatter.Serialize(liveStream,m_objectModel);
byte[] streamOneBytes = liveStream.ToArray();
byte[] streamTwoBytes = m_backupStream.ToArray();
if(!CompareArrays(streamOneBytes, streamTwoBytes))
AddUndoState();
并且比较数组功能以防万一没有人需要它 - 我确信探测不是比较两个数组的最佳方法。
private bool CompareArrays(byte[] a, byte[] b)
{
if (a.Length != b.Length)
return false;
for (int i = 0; i < a.Length;i++)
{
if (a[i] != b[i])
return false;
}
return true;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)