属性序列化/反序列化

时间:2010-08-25 07:01:21

标签: c# serialization

我有一个存储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;
        }
    }

此类序列化为文件。基本上,webserver收集的数据被写入文件。稍后会读取和反序列化这些文件,并且需要将属性数据脱机导入数据库。

我的问题是上面的代码是否会序列化属性从查询字符串中正确提取数据,以后在反序列化数据时,属性是否正确填充并返回?

我正在使用二进制序列化。

提前致谢。

4 个答案:

答案 0 :(得分:0)

根据序列化的上下文,属性ActionName在序列化时是否具有值,因此在反序列化后将检索它。

但是,如果数据源在流程开始处,那么你不应该希望Request.Params [“action_name”]获取其值。

答案 1 :(得分: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;
         }
    }

答案 2 :(得分:0)

如果_actionName有值,这将与二进制序列化一起使用。否则,在反序列化之后,如果查看RequestServer对象以再次获取可能不会出现的值。

答案 3 :(得分:0)

我认为其他人已经建议你注意 - 所以要使序列化工作,你必须这样做  a)在序列化之前调用每个属性getter  b)反序列化后,必须将每个属性字段修改为某些非空的默认值(例如String.Empty)。

现在如果选项b可行,那么

  1. 如果你只有一个这样的类,那么实现ISerializable并满足条件a& b在序列化期间。
  2. 如果您有许多这样的类,那么相对简单的解决方案可能是为您的类型设置一个通用的serialization surrogate,它可能会使用反射(进行属性获取和字段设置)并确保条件a和b得到满足在序列化期间。
  3. 如果b不可行,那么我担心您没有其他选择,只能更新属性定义。