c# - 尽管我实现了 GetObjectData 方法和构造函数,但反序列化不起作用

标签 c# .net serialization

我在类里面有一个静态通用字典。由于静态成员无法序列化,所以我已经实现了 ISerializable 接口(interface)和方法 GetObjectData 来序列化。我有一个构造函数,它也将接受 SerializationInfo 和 StreamingContext 来反序列化字典。现在,当我尝试序列化和反序列化时,它总是返回 1(虽然我添加了 2 个条目)。请找到伪代码-

[Serializable]
public class MyClass : ISerializable
{
  internal  static Dictionary<long, string> dict = new Dictionary<long,string>();

  public void GetObjectData(SerializationInfo info, StreamingContext context)
  {
   info.AddValue("static.dic", MyClass1.dict, typeof(Dictionary<long, string>));
  }

  public MyClass(SerializationInfo info, StreamingContext context)
  {
    MyClass.dict= (Dictionary<long, string>)info.GetValue("static.dic", 
       typeof(Dictionary<long, string>));

  }
  public void Add()
  {
    dict.Add(21, "11");
  }

  public MyClass()
  {
    dict.Add(21, "11");
  }
}


  public class MyClass 
  {       
        MyClass myClass = new MyClass();

        public static void Main()
        {
           myClass.Add();

           FileStream fileStream = new FileStream("test.binary", FileMode.Create);

           IFormatter  bf = new BinaryFormatter();

           bf.Serialize(fileStream, myClass);

            fileStream.Dispose();

            fileStream.Close();

            fileStream = new FileStream("test.binary", FileMode.Open);

            bf = new BinaryFormatter();

            myClass = (MyClass1)bf.Deserialize(fileStream);
     }
}

最佳答案

当您可以轻松发布显示问题的工作代码时,切勿发布“伪代码”。

无论如何,清理代码后,它按预期工作,反序列化对象给我一个包含 2 个元素的字典。我敢打赌这个问题与你的静态字段字典有关。您不应该那样使用静态字段。

你能试试下面的代码并告诉我们问题出在哪里吗?从某种意义上说,这是工作代码,您可以将其粘贴到控制台或 winforms 应用程序的 Program.cs 文件中并对其进行调试。

注意以下几点:

  • 我删除了字典字段的静态
  • 我修复了您用于添加的两个元素的键(都不能是 21)
  • 我重命名了其中一个 MyClass 类,并修复了对 MyClass1 的引用
  • 我稍微重写了主要代码以使用 using block 而不是调用 .Close().Dispose()。<

代码如下:

using System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;

namespace Test
{
    [Serializable]
    public class MyClass : ISerializable
    {
        internal Dictionary<long, string> dict = new Dictionary<long, string>();

        public void GetObjectData(SerializationInfo info, StreamingContext context)
        {
            info.AddValue("static.dic", dict, typeof(Dictionary<long, string>));
        }

        public MyClass(SerializationInfo info, StreamingContext context)
        {
            dict = (Dictionary<long, string>)info.GetValue("static.dic",
               typeof(Dictionary<long, string>));
        }

        public void Add()
        {
            dict.Add(31, "11");
        }

        public MyClass()
        {
            dict.Add(21, "11");
        }
    }

    public class MyClassTest
    {
        public static void Main()
        {
            MyClass myClass = new MyClass();
            myClass.Add();

            using (FileStream fileStream = new FileStream("test.binary", FileMode.Create))
            {
                IFormatter bf = new BinaryFormatter();
                bf.Serialize(fileStream, myClass);
            }

            using (FileStream fileStream = new FileStream("test.binary", FileMode.Open))
            {
                IFormatter bf = new BinaryFormatter();
                myClass = (MyClass)bf.Deserialize(fileStream);
            }
        }
    }
}

关于c# - 尽管我实现了 GetObjectData 方法和构造函数,但反序列化不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1222517/

相关文章:

c# - 如何在 ASP.NET Core 中增强 ModelBinder(更新模型类的属性值)

python - 无法pickle Python 类实例

c# - SQL Server 中大型 IN 子句的替代方法

c# - 在 asp.net 中使用带项目符号列表的 xml

c# - WebApiRequestLifestyle 和 BackgroundJob 混淆

c# - ConfigurationSettings 与 Properties.Settings

java - 在 Java 序列化中,如果一个类有多个对象(组合),那么将以什么顺序检索状态?

list - protobuf 网络 : list with null elements

c# - ObservableCollection 数据绑定(bind)性能

c# - 将鼠标悬停在组合框项目上时更改组合框项目的背景颜色