我有一个对话框,当生成它时,它会填充对象模型中的数据。此时数据被复制并存储在“备份”对象模型中。当用户完成更改并单击“确定”关闭对话框时,我需要一种将备份对象模型与实时模型进行比较的快速方法——如果有任何更改,我可以为用户创建一个新的撤消状态。
如果可能的话,我不想为对象模型中的每个类编写比较函数。
如果我序列化两个对象模型并且它们相同但存储在不同的内存位置,它们是否相等?是否存在比较两个序列化对象模型的简单方法?
最佳答案
我没有为散列字符串而烦恼,而是直接的二进制序列化创造了奇迹。当对话框打开时,序列化对象模型。
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;
}
关于c#比较两个对象模型中的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4616610/