【发布时间】:2017-04-05 09:43:41
【问题描述】:
当我使用 binaryformatter 序列化对象时,我遇到了一个小问题。序列化的重点是可以将值传递到需要字节数组的哈希函数中。
我的过程是,我读取文件,使用newtonsoft Json将json文件转换为POCO对象,进行一些检查,根据需要更新值并以Json格式保存回同一文件。
检查包括验证文件中的哈希值与进程开始时重新生成的内容是否匹配。我采取的步骤是,读取文件,转换为 POCO,使用二进制格式化程序进行序列化,生成哈希值,比较两个值,如果正确,更新数据并将新的哈希值和对象作为 Json 保存到文件中。
但是,当我使用二进制格式化程序序列化对象时遇到了问题。如果对象具有值相同的属性,则序列化程序的字节输出与从文件读入数据到写出数据时不同。由于字节数组的值不同,哈希值也不同。此外,如果属性的值不同,则会生成相同的哈希值,因此不会出现问题。
我的问题是为什么当对象被读取和写入文件时,具有相同的值会导致字节值不同。
[Serializable]
public class UserAuthorisationData
{
public string surname { get; set; }
public string forename { get; set; }
public string initials { get; set; }
public UserAuthorisationData()
{
surname = "";
forename = "";
initials = "";
}
}
例如
var objectA = new UserAuthorisationData()
objectA.surname = "Fred";
objectA.forename = "John";
objectA.initials = "FJ";
var objectB = new UserAuthorisationData()
objectB.surname = "John";
objectB.forename = "John";
objectB.initials = "JJ";
在上面的例子中,objectA 的字节数组的值是相同的,当哈希值在数据被写出和文件被读回时产生。
但是,对于 objectB,值不同。
下面的方法将对象转换为字节:
protected virtual byte[] ObjectToByteArray(object objectToSerialize)
{
BinaryFormatter formatter = new BinaryFormatter();
MemoryStream fs = new MemoryStream();
try
{
lock (locker)
{
formatter.Serialize(fs, objectToSerialize);
Logger.Debug($"Successfully converted object to bytes for serialization.");
}
File.WriteAllBytes(@"C:\ali.kamal\User1.txt", fs.ToArray());
return fs.ToArray();
}
}
在对象上调用方法
ObjectToByteArray(objectA);
ObjectToByteArray(objectB);
更新 1
谢谢哈迪。哈希码是使用 Microsoft 的 HMACSHA256.computeHash 方法生成的。
protected override string ComputeHash(byte[] objectAsBytes, byte[] key)
{
byte[] hashValue = null;
try
{
using (HMACSHA256 hmac = new HMACSHA256(key))
{
hashValue = hmac.ComputeHash(objectAsBytes);
}
}catch(Exception ex)
{
EventLogger.LogEvent($"Could not generate SHA256 hash value, exception:{ex.Message}", EventEntryType.Error);
}
return Convert.ToBase64String(hashValue);
}
例如
string hashvalue = ComputeHash(ObjectToByteArray(objectA), ObjectToByteArray("abcd"))
【问题讨论】:
标签: c# arrays json serialization hash