首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >‘未反序列化对象时调用了OnDeserialization方法。’从哈希表反序列化

‘未反序列化对象时调用了OnDeserialization方法。’从哈希表反序列化
EN

Stack Overflow用户
提问于 2018-07-13 20:31:34
回答 0查看 113关注 0票数 1

我有一个哈希表,其中存储了断电后应用程序工作所需的键/值。它们使用BinaryFormatter存储到文件中。我试图通过仅将缺省值类型(如int、float、string、object等)放入哈希表来说明版本控制,但也添加了一些枚举。

有时在更新应用程序时,哈希表不能正确地反序列化。我怀疑要么是我使用的混淆程序(所有枚举都被禁止重命名符号),要么是某个字段不知何故被添加到了我遗漏的对象中。反序列化调用:

代码语言:javascript
复制
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方法。’

代码语言:javascript
复制
[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

EN

回答

页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51325175

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档