zoukankan      html  css  js  c++  java
  • 类的XML序列化(XML Serialization)

    最近做的一个ASP.NET项目中,需要在一个页面中维护一个类的数组,在每次页面刷新的使其前一次的状态保持不变。开始错误的使用了static,导致了致命的共享错误。后来突然想起C#类能够使用XML序列化出来,然后保存在XML里或者保存在页面的一个隐藏表单里(稍后再比较这两种方法的优劣)。下面来介绍这两个类序列化的应用。
    保存于XML中的序列化C#类

    先声明那个需要保存的类如下:

     [Serializable]
     public class HalfHour
     {
         public string ibtnHalfHourName;
         public int status;
         public bool isFirst;
         public int eventID;
         public bool isHead;
     
             public HalfHour()
         {
             this.ibtnHalfHourName = "";
             this.status = HalfHour.BLANK;
             this.isFirst = false;
             this.eventID = -1;
            this.isHead = false;
         }
     
    }
    

    然后为这个类分别定义一个Serial和Deserial两个方法,分别完成序列化和反序列化这两件事(必要的namespace是System.Xml.Serialization和System.IO):

    public static void Serial(HalfHour[] halfHours, string path)
     {
         XmlSerializer xmlSerializer = new XmlSerializer(typeof(HalfHour[]));
         TextWriter writer = new StreamWriter(path);
         try
         {            
             xmlSerializer.Serialize(writer, halfHours);
         }
         finally
         {
             writer.Close();
         }
     }
     
    public static HalfHour[] Deserial(string path)
    {
         XmlSerializer xmlSerializer = new XmlSerializer(typeof(HalfHour[]));
         FileStream fs = new FileStream(path, FileMode.Open);
         HalfHour[] halfHours;
         try
         {
             halfHours = (HalfHour[])xmlSerializer.Deserialize(fs);
         }
         finally
         {
             fs.Close();
         }
         return halfHours;
     }

    这两个函数的调用应该很容易理解:对于Serial,你只需提供XML的保存路径和你需要序列化的那个类数组。而Deserial则只需要提供读取的XML路径即可。
    保存于隐藏表单中的序列化C#类 要序列化的类的声明和上面一致,这里不再重复。但你需要在你的Web页面中定义你的隐藏表单。 下面是Serial和Deserial函数的重载版本,这里要引入System.Text的namespace:

    public static string Serial(HalfHour[] halfHours)
    {
         XmlSerializer xmlSerializer = new XmlSerializer(typeof(HalfHour[]));
         MemoryStream memoryStream = new MemoryStream();
         xmlSerializer.Serialize(memoryStream, halfHours);
         return Encoding.UTF8.GetString(memoryStream.GetBuffer());
     }
     
    public static HalfHour[] Deserial(string serialedObject)
     {
         XmlSerializer xmlSerializer = new XmlSerializer(typeof(HalfHour[]));
         MemoryStream memoryStream = new MemoryStream(Encoding.UTF8.GetBytes(serialedObject));
         return (HalfHour[])xmlSerializer.Deserialize(memoryStream);
     }

    两种方式的比较                选择文件读写方式显然在服务器运行速度上会比较慢,而且要构思不产生冲突的文件名,同时还要考虑文件系统的读写权限问题。写入表单则没有这个问题,但是如果序列化的对象过大的话,会是整个页面文件变得很大,造成传输过程的缓慢。所以建议如果要序列化的对象较小,则选择后者。反之则选择前者。

  • 相关阅读:
    游戏类型
    cocos2d-x lua 一些语法
    lua中ipairs和pairs
    lua的一些语法
    误删jre怎么办
    右键android工程的包名选择Build Path后怎么还原
    播放Armature动画
    接入第三方sdk出现了一些问题总结
    gettimeofday() 获取系统时间,精确到微秒 这个似乎只能在linux 下用,不能在windows 下用
    windows timeGetTime() 函数 获取系统从开机到现在的毫秒时间值
  • 原文地址:https://www.cnblogs.com/jameslif/p/4522651.html
Copyright © 2011-2022 走看看