zoukankan      html  css  js  c++  java
  • 类的序列化到XML与XML反序列化到类


    借鉴cnblog的源码,开始做了一个简单的类及序列化,还比较顺利,后来做了一个包含索引的类,而索引本身又是一个类时遇到了麻烦(集合类)
    始终出现错误:不应有 <*** xmlns=''>。//***指集合类名称.
    后来试了一下,把开始做的那个不含集合类的XML文件中的元素名称改了,出现相同的错误,所以基本上确认是元素名称错了.
    后来网上搜索,看到dudu也曾遇到过这类问题
    http://www.cnblogs.com/dudu/archive/2004/03/24/4064.html
    是因为集合类从CollectionBase继承,因此生成的元素名称为成员类的名称前加ArrayOf
    这样做了,还是出现问题,
    没办法,只好用.text自带的SerializationHelper.Save序列化这个集合类到一个XML文件中看看到底是什么,shit,居然是大小写的问题.
    我的成员类是用的首字母小写,但集合类序列化后却生成的ArrayOf+首字母大写的成员类名
    XML区分大小写我事先知道,但没想到序列化的类会自动转换为首字母大写,哎,都怪自己偷懒,没有按规范写成员类的名称首字母大写.

    XML文件
    <ArrayOfDepartment>
     <Department>
     <name>研发中心</name> 
     </Department>
     <Department>
     <name>营销中心</name> 
     </Department> 
    </ArrayOfDepartment>

    [Serializable]
     
    public   class  Department
     
    {
      
    public  Department()
      
    {
      }

      
    private   string  _name;
      
    public   string  name
      
    {
       
    get
       
    {
        
    return   this ._name;
       }

       
    set
       
    {
        
    this ._name = value;
       }

      }

     }


    [Serializable]
    public   class  DepartmentCollection:CollectionBase
     

       
      
    public  DepartmentCollection()
      
    {
       
    //
       
    //  TODO: 在此处添加构造函数逻辑
       
    //    
      }
       
      
    public  Department  this [ int  index] 
      
    {
       
    get   { return  ((Department)( this .List[index]));}
      }


      
    public   int  Add(Department dp) 
      
    {   
       
    return  List.Add(dp) ;
      }

     }


    public   static   object  Load(Type type,  string  filename)
      
    {
       FileStream fs 
    =   null ;
       
    try
       
    {
        
    //  open the stream
        fs  =   new  FileStream(filename, FileMode.Open,FileAccess.Read);
        XmlSerializer serializer 
    =   new  XmlSerializer(type);
        
    return  serializer.Deserialize(fs);
       }

       
    catch (Exception e)
       
    {
        
    throw  e;
       }

       
    finally
       
    {
        
    if (fs  !=   null )
         fs.Close();
       }

  • 相关阅读:
    【模板】Splay Tree
    【题解】CF718C Sasha and Array
    【题解】SP2916 GSS5
    【题解】[ZJOI2013] K大数查询
    【游记】GDOI 2021游记+赛后总结
    【游记】CSP2020 J/S游记
    【知识点】Manacher算法详解
    Vue 父组件传值给子组件,子组件拿到值,在倒计时完成后再调用父组件进行接口跳转
    V-model 结合select类型
    双向绑定和radio结合使用
  • 原文地址:https://www.cnblogs.com/zyk/p/72393.html
Copyright © 2011-2022 走看看