2013-11-01 4 views
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' 

    } 

Как я могу это исправить?

+2

Ну что такое '' Сервер'? Ошибка * четко указывает, в чем проблема. У вас есть экземпляр «Server»? Нет? Сделай один. – Arran

+2

Дубликат вопрос: http://stackoverflow.com/q/1293496/1541819 – pescolino

+1

Эта тема была отреагирована на http://stackoverflow.com/questions/1293496/serialize-a-static-class – Lucian0c

ответ

11

Вы обычно сериализуете экземпляров. У вас не может быть экземпляр статического класса, поэтому нет смысла его сериализовать.

Если вам нужно сериализовать статическое состояние статического класса, то вы, вероятно, должны сделать его нестатистическим для начала. Если вам нужно действительно необходимо сохранить статический класс статическим, но сериализуйте статическое состояние, вы можете создать нормальный класс с теми же переменными (но переменными экземпляра вместо статических) и создать методы в вашем статическом классе для создания экземпляра из текущее статическое состояние, или заменить текущее статическое состояние на основе экземпляра прошло. Но в основном это не очень приятно делать так ...

+6

Повторяющийся ответ: http: // stackoverflow.com/a/1293522/1541819 ;-) – pescolino

+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

Статический класс, безусловно, может содержать состояние - но это все * статическое состояние *. –

+0

@ JonSkeet Да, это правда, удалит эту часть из моего ответа. – James

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(); } 
    } 
} 

Возможно, возникли некоторые проблемы с этим, поскольку я закодировал его в браузере.

1

Скорее всего, вы хотите сохранить значения переменных. Просто напишите метод в классе, чтобы сделать это. Вы можете использовать любой из классов записи, предоставляемых для потоков, и вы можете прочитать их обратно, используя один из классов читателя.

Смежные вопросы