2010-08-25 4 views
0

У меня есть класс, который хранит данные, собранные веб-сервером asp.net. Он содержит несколько свойств, таких как:Свойства сериализации/десериализации

private string _actionName; 
public string ActionName 
    { 
     get 
     { 
      if (_actionName == null) 
       _actionName = Request.Params["action_name"] != null 
            ? Server.UrlDecode(Request.Params["action_name"]) 
            : ""; 

      return _actionName; 
     } 
    } 

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

Мой вопрос заключается в том, будет ли приведенный выше код сериализовать свойства, правильно извлекающие данные из строки запроса, а позже, когда данные десериализованы, свойства правильно заполнены и возвращены?

Я использую двоичную сериализацию.

Заранее спасибо.

ответ

0

Я думаю, что другие уже советовал вам о предостережениях - так что для сериализации на работу, вы должны а) Призови каждого из свойств добытчика до десериализации б) после десериализации, должны изменить каждое поле свойств какого-то не нулевое значение по умолчанию (например, String.Empty).

Теперь, если опция б выполнима тогда

  1. Если у вас есть только один такой класс орудия ISerializable и удовлетворяют условиям а & б во время сериализации.
  2. Если у вас много таких классов, то относительно простое решение может состоять в том, чтобы иметь общий тип serialization surrogate для ваших типов, которые, вероятно, будут использовать отражение (для создания свойства get и field set) и обеспечить выполнение условий a и b во время сериализации.

Если b не представляется возможным, я боюсь, что у вас нет другого выбора, кроме как обновить определения свойств.

0

В зависимости от контекста сериализации свойство ActionName будет иметь значение или нет при сериализации и, следовательно, будет извлекать его или нет после десериализации.

Но вы не должны надеяться на Request.Params ["action_name"], чтобы вернуть его значение, если источник данных находился там в начале процесса.

0

Если экземпляр сериализуется до того, как свойство ActionName будет прочитано хотя бы один раз, оно не будет правильно сериализовано. Я бы предложил эти изменения, но даже в этом случае вы должны быть абсолютно уверены, что сериализация происходит в потоке запроса (т. Е. У вас есть доступ к Request and Server).

[NonSerialized] 
private string _actionName; 
public string ActionName 
    { 
     get 
     { 
      if (_actionName == null) 
       _actionName = Request.Params["action_name"] != null 
            ? Server.UrlDecode(Request.Params["action_name"]) 
            : ""; 

      return _actionName; 
     } 
     set 
     { 
      _actionName= value; 
     } 
    } 
0

Это будет работать с двоичной сериализацией, если _actionName имеет значение. В противном случае после десериализации, если бы посмотрели объекты Request или Server, чтобы снова получить значение, которое может не ожидаться.

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