【问题标题】:How do i serialize static class? [duplicate]我如何序列化静态类? [复制]
【发布时间】:2013-11-02 00:10:22
【问题描述】:

我需要用 BinaryFormatter 序列化静态类,代码如下:

    void Serialize()
    {
        IFormatter formatter = new BinaryFormatter();

        using (FileStream s = File.Create("ServerInfo.bin"))
            formatter.Serialize(s, Server); // ERROR: Error 44 'Server' is a 'type' but is used like a 'variable'

    }

我该如何解决这个问题?

【问题讨论】:

标签: c# serialization binaryformatter


【解决方案1】:

您通常会序列化实例。你不能有一个静态类的实例,所以序列化它是没有意义的。

如果您需要序列化静态类的静态状态,那么您可能应该从一开始就将其设为非静态。如果您真的需要保持静态类静态但序列化静态状态,您可以创建一个具有相同变量(但实例变量而不是静态变量)的普通类,并在静态类中创建方法从当前的静态创建一个实例,或者根据传入的实例替换当前的静态。但从根本上说,这样做并不是非常愉快...

【讨论】:

  • 模拟静态类的一个相当好的方法是通过单例实现它。这将类保留为实例,但确保只有一个副本。这样,您将能够序列化它并以类似于静态类的方式访问它(尽管通过静态引用)
【解决方案2】:

您只能序列化对象。假设 Server 类如下所示。

class Server
{
    public static string Name { get; set; }
    public static string IpAddresss { get; set; }
}

您不能序列化它,因为没有要序列化的对象。您可以序列化字符串,但这不是您想要做的。

您可以使用单例模式来执行此操作。

class Server
{
    private static Server _instance;
    public string Name { get; set; }
    public string IpAddress { get; set; }

    public static Server Instance 
    { 
        get { return _instance ?? ( _instance = new Server(); }
    }
}

这可能有一些问题,因为我在浏览器中编写了代码。

【讨论】:

    【解决方案3】:

    序列化的重点是序列化object状态,并且给定static 类无法实例化,这表明它们不适合序列化。

    我该如何解决这个问题?

    考虑为序列化创建一个临时类,例如ServerState,转移您想要存储的任何状态并改为使用它

    public static class Server
    {
        public static ServerState CurrentState
        {
            return new ServerState
            {
                ...
            };
        }
    
        public static void LoadState(ServerState state)
        {
            ...
        }
    }
    
    ...
    IFormatter formatter = new BinaryFormatter();
    
    using (FileStream s = File.Create("ServerInfo.bin"))
        formatter.Serialize(s, Server.CurrentState);
    

    【讨论】:

    • 静态类当然可以包含状态 - 但它都是 static 状态。
    • @JonSkeet 是的,这是真的,将从我的答案中删除该部分。
    【解决方案4】:

    最有可能的是,您想要保存变量的值。只需在类中编写一个方法即可。您可以使用为流提供的任何编写器类,也可以使用其中一个读取器类读回它们。

    【讨论】:

      猜你喜欢
      • 2011-05-27
      • 2010-11-20
      • 2020-06-07
      • 2012-01-03
      • 1970-01-01
      • 2012-10-31
      • 1970-01-01
      • 2010-11-03
      • 1970-01-01
      相关资源
      最近更新 更多