我如何序列化静态类?

时间:2013-11-01 15:52:54

标签: c# serialization binaryformatter

我需要用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'

    }

我该如何解决这个问题?

4 个答案:

答案 0 :(得分:11)

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

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

答案 1 :(得分:2)

序列化的目的是序列化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);

答案 2 :(得分:2)

您只能序列化对象。我们假设Server类看起来像这样。

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

由于没有要序列化的对象,因此无法对其进行序列化。您可以序列化字符串,但这不是您想要做的。

您可以使用Singleton模式执行此操作。

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 :(得分:1)

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