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();
       }

  • 相关阅读:
    PS初步学习经验心得记录
    css第四天--复合选择器和样式三大特性
    css第三天--盒子模型
    html第二天--表单控件和表格
    css第二天--字体属性和文本属性
    vue计算属性(computed)
    ant-input的使用
    js-split() 方法
    设计转到前端开发
    $set
  • 原文地址:https://www.cnblogs.com/zyk/p/72393.html
Copyright © 2011-2022 走看看