0

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

4 回答 4

11

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

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

于 2013-11-01T15:55:16.547 回答
2

序列化的重点是序列化一个给定的类的状态,这表明它们不适合序列化。objectstatic

我怎样才能解决这个问题?

考虑为序列化创建一个临时类,例如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);
于 2013-11-01T15:57:33.003 回答
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(); }
    }
}

这可能存在一些问题,因为我在浏览器中对其进行了编码。

于 2013-11-01T15:59:40.180 回答
1

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

于 2013-11-01T16:00:36.137 回答