大家好,现在我在参与做一个仿真工具,该工具的使用以工程为单位,在操作时可以中途保存工程文件,然后以后继续打开操作,或者打开查看。现在的问题是,系统的工程文件在保存时使用了大量的对象序列化技术,然后在打开工程的时候反序列化还原工程环境。(顺便请教一下大家,这样做好不?有没更好的做法?) 问题就产生了,如果后来需求发生了变化,必需在某一个类中增加,或者删除了一个字段,那么重新编译过系统后,代码中涉及到反序列化还原旧工程中的对象时就有很多问题,很多反序列化的异常,直接的后果就是一旦系统发生了变化,以前的旧工程就不能用了,而生成一个工程的步骤又非常麻烦,导致现在测试人员非常头痛,,,,不知道大家碰到过类似的问题没?请指教一下,非常感谢

解决方案 »

  1.   

    遇到过,VC就这样,把一个VC6.0的工程升级到2005,大堆编译警告和编译错误只能每次升级想办法兼容以前版本的文件了,最好序列化前,给文件加个文头,标明版本,后期反序列化时,根据文头选择适当的反序列化方式
      

  2.   

    将类放到一个DLL中
    序列化和反序列化都程式都透过那个DLL取得类
    LZ可考虑这样做...
    这样只要更新DLL,并确保DLL版本相同
    随时都可序列化与反序列化
    小弟目前的项目是用这方法控管要序列化的数据类
      

  3.   

    工程信息保存进数据库不行吗?单机版本的话,mdb就可以了啊
      

  4.   

    谢谢大家,to jointan:这种方法比较适用于后面大版本的升级,现在产品尚在测试阶段,呵呵,搞得那些功能测试的同事非常无语,因为很容易测出问题,然后稍改改,以前配置好的工程就废了要重新配。to cloudhsu:这位大哥,能否再稍讲点细节么,呵呵,还有点懂不起to supercpu123:如果存在MDB中的话,每次工程还原的时候,序列化好像有点麻烦吧,我试一下,非常感谢继续期待大家指点ING
      

  5.   

    你可以自己定制序列化和反序列化,不必用.NET里面的
      

  6.   

    如果后来需求发生了变化,必需在某一个类中增加,或者删除了一个字段这样不可取,你只要设计一个类,包含的是Key/Value的集合,就可以任意增加删减集合的值,但是不需要删减类的字段.举例来说,可以用Dictionary<string,object>,string表示值的名称,object表示具体的值,可以是任意类型.序列化就是序列化这个Dictionary.
    拿值可以按泛型来拿T GetValue(string key, T defaultValue)
    {
       object val;
       if(dic.TryGetValue(key,out val))
        {  
            return (T)val;
       }
       else 
       {
           return defaultValue;
       }
    }
      

  7.   

    楼主这种情况在《Effective C#》里有讲过的,作者建议是楼主自己实现ISerializable接口,这样新增加的属性在旧有的序列文件中没有,可以写程序来控制,详情见《Effective C#》
      

  8.   

    楼主看下这个http://space.itpub.net/12639172/viewspace-482000
      

  9.   

    楼主重点看下,《Effective C#》的作者,是怎么处理多版本问题的