我有一个哈希表,其中存储了断电后应用程序工作所需的键/值。它们使用BinaryFormatter存储到文件中。我试图通过仅将缺省值类型(如int、float、string、object等)放入哈希表来说明版本控制,但也添加了一些枚举。
有时在更新应用程序时,哈希表不能正确地反序列化。我怀疑要么是我使用的混淆程序(所有枚举都被禁止重命名符号),要么是某个字段不知何故被添加到了我遗漏的对象中。反序列化调用:
var hashtable = new Hashtable();
using (var stream = new FileStream(fileName, FileMode.Open))
{
var formatter = new BinaryFormatter(selector, context);
try
{
hashtable = (Hashtable) formatter.Deserialize(stream);为了解决这个问题,我创建了一个序列化的shown类,如下所示。在反序列化时,我得到以下SerializationException:‘在对象未被反序列化时,调用了OnDeserialization方法。’
[Serializable]
public class HashtableSerializationSurrogate : IDeserializationCallback, ISerializationSurrogate
{
public HashtableSerializationSurrogate() : base()
{
}
private static SerializationInfo serializationInfo = null;
void ISerializationSurrogate.GetObjectData(object obj, SerializationInfo info, StreamingContext context)
{
Hashtable hashtable = (Hashtable) obj;
object[] objArray1 = new object[hashtable.Count];
object[] objArray2 = new object[hashtable.Count];
hashtable.Keys.CopyTo(objArray1, 0);
hashtable.Values.CopyTo(objArray2, 0);
// ISSUE: type reference
info.AddValue("Version", 0, typeof(int));
// ISSUE: type reference
info.AddValue("Keys", objArray1, typeof(object[]));
// ISSUE: type reference
info.AddValue("Values", objArray2, typeof(object[]));
// How much space to allocate to the hashtable.
info.AddValue("HashSize", (fieldinfo.GetValue(obj) as Array).Length);
serializationInfo = info;
}
private static FieldInfo fieldinfo = typeof(Hashtable).GetField("buckets", (BindingFlags) 36);
object ISerializationSurrogate.SetObjectData(object obj, SerializationInfo info, StreamingContext context, ISurrogateSelector selector)
{
return obj;
}
void IDeserializationCallback.OnDeserialization(object sender)
{
var hashtable = (Hashtable)sender;
hashtable.OnDeserialization(this);
// Populate hash table
object[] keys = (object[])serializationInfo.GetValue("Keys", typeof(object[]));
object[] values = (object[])serializationInfo.GetValue("Values", typeof(object[]));
// Add each (key,value] pair to the actual Hashtable
for (int x = 0; x < keys.Length; x++)
hashtable.Add(keys[x], values[x]);
serializationInfo = null;
}
}我完全被困在这里了。有人知道为什么在SetObjectData调用之后抛出这个异常吗?
编辑:Stacktrace
https://stackoverflow.com/questions/51325175
复制相似问题