我在类里面有一个静态通用字典。由于静态成员无法序列化,所以我已经实现了 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/