2010-08-25 130 views
0

我有一个存储由asp.net webserver收集的数据的类。它包含几个属性,如:属性序列化/反序列化

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

我以为别人已经劝你有关的注意事项 - 所以系列化的工作,你必须 一)系列化 二)反序列化后之前调用各个属性的getter的,必须修改每个属性字段一些不为空默认值(如String.Empty)。现在

如果选项B是可行的,然后

  1. 如果只有一个这样的类实现了ISerializable和序列化过程中满足条件&湾
  2. 如果你有很多这样的类则相对容易的解决办法是为您的类型可能会使用反射(做财产get和现场设置),并确保条件A和B序列化过程中得到满足通用serialization surrogate

如果b不可行,那么恐怕您没有其他选择,只能更新属性定义。

0

根据序列化的上下文,ActionName属性在序列化时将有或没有值,因此在反序列化之后将检索或不检索。

但是,如果数据源在进程开始时位于那里,那么您不应该希望Request.Params [“action_name”]获取其值。

0

如果实例在ActionName属性被读取至少一次之前被序列化,它将不会正确序列化。我会提出这些更改,但即使在这种情况下,您也必须绝对确信序列化在请求线程中发生(即您可以访问请求和服务器)。

[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有一个值,这将适用于二进制序列化。否则,在反序列化之后,如果会查看RequestServer对象以再次获取可能不会预期的值。