gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 19:36:33 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com