C# >你能试试下面的代码并告诉我们问题是什么吗?这是工作代码,您可以将其粘贴到控制台或winforms应用程序的Program.cs文件中并进行调试

C# >你能试试下面的代码并告诉我们问题是什么吗?这是工作代码,您可以将其粘贴到控制台或winforms应用程序的Program.cs文件中并进行调试,c#,.net,serialization,C#,.net,Serialization,请注意以下事项: 我消除了dict字段的静态性 我修复了用于添加的两个元素的键(不能都是21) 我重命名了一个MyClass类,并修复了对MyClass1的引用 我稍微重写了主代码,使用使用块,而不是调用.Close()和.Dispose() 代码如下: using System; using System.Collections.Generic; using System.IO; using System.Runtime.Serialization; using System.Runtim

请注意以下事项:

  • 我消除了dict字段的静态性
  • 我修复了用于添加的两个元素的键(不能都是21)
  • 我重命名了一个MyClass类,并修复了对MyClass1的引用
  • 我稍微重写了主代码,使用
    使用
    块,而不是调用
    .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);
            }
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.IO;
使用System.Runtime.Serialization;
使用System.Runtime.Serialization.Formatters.Binary;
名称空间测试
{
[可序列化]
公共类MyClass:ISerializable
{
内部字典dict=新字典();
public void GetObjectData(SerializationInfo信息、StreamingContext上下文)
{
信息附加值(“static.dic”,dict,typeof(Dictionary));
}
公共MyClass(SerializationInfo信息、StreamingContext上下文)
{
dict=(Dictionary)info.GetValue(“static.dic”,
类型(字典);
}
公共无效添加()
{
补充(31,“11”);
}
公共MyClass()
{
添加(21,“11”);
}
}
公共类MyClassTest
{
公共静态void Main()
{
MyClass MyClass=新的MyClass();
myClass.Add();
使用(FileStream FileStream=newfilestream(“test.binary”,FileMode.Create))
{
IFormatter bf=新的二进制格式化程序();
序列化(文件流,myClass);
}
使用(FileStream FileStream=newfilestream(“test.binary”,FileMode.Open))
{
IFormatter bf=新的二进制格式化程序();
myClass=(myClass)bf.反序列化(fileStream);
}
}
}
}

您不想为此使用静态类。您希望使用在第一次创建时加载的单例。您可能还需要一个刷新方法。

您不想为此使用静态类。您希望使用在第一次创建时加载的单例。您可能还需要一个刷新方法。

您的代码看起来几乎完成,但无法编译。帮每个人一个忙,先把它变成一个(简短的)工作程序,然后再发布。你的代码看起来几乎完成了,但无法编译。帮每个人一个忙,先把它变成一个(简短的)工作程序,然后把它发布到.thnx上,等待你的回复。我使用的是静态字典bcoz,因为我的字典可以容纳20000个值,所以如果我的类下次被初始化,我不想再次调用我的sp。我还想在用户试图保存新条目时将新条目添加到字典中。我知道序列化静态对象是一种缺陷设计,但在这种情况下,我必须将dict声明为静态对象,否则将产生巨大的perofmance开销。lasse你的代码可以工作,但是你能告诉我当ym构造函数被调用时dict的y count返回零吗?(反序列化时)lasse,有没有什么方法可以同时实现基本和混合序列化,bcoz我只需要dictionay来实现自定义,而类的其他成员可以以基本/正常的方式序列化。thnx供你回复。我使用的是静态字典bcoz,因为我的字典可以容纳20000个值,所以如果我的类下次被初始化,我不想再次调用我的sp。我还想在用户试图保存新条目时将新条目添加到字典中。我知道序列化静态对象是一种缺陷设计,但在这种情况下,我必须将dict声明为静态对象,否则将产生巨大的perofmance开销。lasse你的代码可以工作,但是你能告诉我当ym构造函数被调用时,dict的y count返回零吗?(反序列化时)lasse,有没有什么方法可以同时实现基本序列化和混合序列化,因为我只需要dictionay来实现自定义,而类的其他成员可以以基本/正常的方式序列化。
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);
            }
        }
    }
}