我需要用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'
}
我该如何解决这个问题?
答案 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)
最有可能的,你想要的是保存变量的值。只需在类中编写一个方法即可。您可以使用为流提供的任何编写器类,您可以使用其中一个读取器类来读取它们。