- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我在类里面有一个静态通用字典。由于静态成员无法序列化,所以我已经实现了 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 文件中并对其进行调试。
注意以下几点:
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/
我对来自 MSDN 的序列化样本感到困惑. 我的困惑在于方法 GetObjectData(在序列化过程中被调用),方法, 序列化附加数据(在 AddValue 的 GetObjectData 方法中)
据我所知,具体实现接口(interface) :)查看 DateTime 结构似乎实现了 ISerializable。假设要实现: void GetObjectData(SerializationIn
我正在尝试扩展一个框架。我正在扩展的类之一是序列化的。基类的 GetObjectData() 方法未标记为虚拟,因此我无法覆盖它。 现在,如果对象在作为基类引用时被序列化,则它不是多态的,因此仅调用基
我正在编写自定义序列化程序,我刚刚完成了用于处理 ISerializable.GetObjectData 的部分的实现。但是当我去反序列化信息并将其重新应用于图形时,我没有看到 Set-ObjectD
我们正在使用二进制格式化程序来序列化对象图,其中多个路径可能引用相同的对象。然而,在序列化期间,特定对象的 GetObjectData 会被多次调用。当尝试使用使用更简单对象的测试样本时,它会被调用一
我在类里面有一个静态通用字典。由于静态成员无法序列化,所以我已经实现了 ISerializable 接口(interface)和方法 GetObjectData 来序列化。我有一个构造函数,它也将接受
我有一个标记为 Serializable 的值对象类 (UserData),它包含另一个标记为 Serializable 并实现 ISerializable 的类 (StringType),以便它可以
XmlSerializer 从不在我的 ISerializable 上调用 GetObjcetData()。 GetObjectData() 何时被调用?谢谢! class Program { s
我知道字典不会按照添加的顺序存储它们的键值对,但是如果我将相同的键值对(可能以不同的顺序)添加到两个不同的字典并序列化结果,文件中的数据是否相同? 编辑:澄清一下,我专门询问 GetObjectDat
我有一个标有 AllowPartiallyTrustedCallersAttribute 的程序集,其中包含一个自定义异常类。我想通过覆盖 GetObjectData 使其可序列化。 在 .NET 4
我是一名优秀的程序员,十分优秀!