序列化和反序列化简单使用

序列化、反序列化

主要用于存储对象状态为另一种通用格式,比如存储为二进制、xml、json等等,把对象转换成这种格式就叫序列化,而反序列化通常是从这种格式转换回来。

  使用序列化主要是因为跨平台和对象存储的需求,因为网络上只允许字符串或者二进制格式,而文件需要使用二进制流格式,如果想把一个内存中的对象存储下来就必须使用序列化转换为xml(字符串)、json(字符串)或二进制(流)。

  本例是二进制(流)的序列化和反序列化:

using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Runtime.Serialization.Formatters.Binary;
using System.Text;
using System.Windows.Forms;

namespace ServerManager
{
    public partial class TimeSeting : Form
    {
        public TimeSeting()
        {
            InitializeComponent();
            this.FormClosing += (sender, e) => { e.Cancel = true; this.Visible = false; };
        }

        /// <summary>
        /// 序列化所保存的路径
        /// </summary>
        private string strfile = null;
        public string StrFile
        {
            get
            {
                if (strfile.IsNullOrWhiteSpace())
                {
                    string path = System.Reflection.Assembly.GetExecutingAssembly().Location;
                    strfile = System.IO.Path.Combine(System.IO.Path.GetDirectoryName(path), "setting.Config");
                }
                return strfile;
            }
            set { strfile = value; }
        }

        /// <summary>
        /// 保存设置 并序列化数据
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnSave_Click(object sender, EventArgs e)
        {
            try
            {
                if (txtStart.Text.IsNullOrWhiteSpace() || txtEnd.Text.IsNullOrWhiteSpace() || txtMinute.Text.IsNullOrWhiteSpace() || txtFailure.Text.IsNullOrWhiteSpace())
                {
                    MessageBox.Show("设置项不能为空!","提示",MessageBoxButtons.OK);
                    return;
                }
                MainSetting newmainset = new MainSetting();
                newmainset.SetStart = Convert.ToInt32(txtStart.Text);
                newmainset.SetEnd = Convert.ToInt32(txtEnd.Text);
                newmainset.SetMinute = Convert.ToInt32(txtMinute.Text);
                newmainset.SetFailure = Convert.ToInt32(txtFailure.Text);
                if (newmainset.SetFailure < 2)
                {
                    MessageBox.Show("失败间隔不能小于2分钟!");
                    return;
                }
                if (newmainset.SetStart > newmainset.SetEnd)
                {
                    MessageBox.Show("开始时间不能小于结束时间!");
                }
                else
                {
                    MainSet = newmainset;
                    Serialize(MainSet);
                    this.Visible = false;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
        /// <summary>
        /// 序列化设置
        /// </summary>
        /// <param name="set"></param>
        public void Serialize(MainSetting set)
        {
            using (FileStream fs = new FileStream(StrFile, FileMode.Create))
            {
                BinaryFormatter formatter = new BinaryFormatter();
                formatter.Serialize(fs, set);
                fs.Close();
            }
        }

        MainSetting mainSet;
        public MainSetting MainSet
        {
            get
            {
                if (mainSet == null)
                {
                    DeSerialize();
                }
                return mainSet;
            }
            set
            {
                mainSet = value;
                Service.HostingSystemHelper.Instance.ExecMin = value.SetStart;
                Service.HostingSystemHelper.Instance.ExecMax = value.SetEnd;
                Service.HostingSystemHelper.Instance.SetMinute = value.SetMinute;
                Service.HostingSystemHelper.Instance.SleepMinutes = value.SetFailure;
            }
        }

        /// <summary>
        /// 反序列化设置
        /// </summary>
        public void DeSerialize()
        {
            if (System.IO.File.Exists(StrFile))
            {
                using (FileStream fs = new FileStream(StrFile, FileMode.Open))
                {
                    BinaryFormatter formatter = new BinaryFormatter();
                    MainSet = (MainSetting)(formatter.Deserialize(fs));
                }
            }
            else
            {
                MainSet = new MainSetting() { SetStart = Service.HostingSystemHelper.Instance.ExecMin, SetEnd = Service.HostingSystemHelper.Instance.ExecMax, SetMinute = Service.HostingSystemHelper.Instance.SetMinute, SetFailure = Service.HostingSystemHelper.Instance.SleepMinutes };
            }
        }
        /// <summary>
        /// 加载设置
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void TimeSeting_Load(object sender, EventArgs e)
        {
            this.txtStart.Text = MainSet.SetStart + string.Empty;
            this.txtMinute.Text = MainSet.SetMinute + string.Empty;
            this.txtEnd.Text = MainSet.SetEnd + string.Empty;
            this.txtFailure.Text = mainSet.SetFailure + string.Empty;
        }

        //如果输入的不是数字键,也不是回车键、Backspace键,则取消该输入
        private void txtStart_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (!(Char.IsNumber(e.KeyChar)) && e.KeyChar != (char)13 && e.KeyChar != (char)8)
            {
                e.Handled = true;
            }
        }
        //如果输入的不是数字键,也不是回车键、Backspace键,则取消该输入
        private void txtEnd_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (!(Char.IsNumber(e.KeyChar)) && e.KeyChar != (char)13 && e.KeyChar != (char)8)
            {
                e.Handled = true;
            }
        }
        //如果输入的不是数字键,也不是回车键、Backspace键,则取消该输入
        private void txtMinute_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (!(Char.IsNumber(e.KeyChar)) && e.KeyChar != (char)13 && e.KeyChar != (char)8)
            {
                e.Handled = true;
            }
        }
        //如果输入的不是数字键,也不是回车键、Backspace键,则取消该输入
        private void txtFailure_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (!(Char.IsNumber(e.KeyChar)) && e.KeyChar != (char)13 && e.KeyChar != (char)8)
            {
                e.Handled = true;
            }
        }
    }

    [Serializable]
    public class MainSetting
    {
        public int SetStart
        {
            get;
            set;
        }

        public int SetEnd
        {
            get;
            set;
        }

        public int SetMinute
        {
            get;
            set;
        }

        public int SetFailure
        {
            get;
            set;
        }
    }
}
时间: 2024-10-09 16:23:28

序列化和反序列化简单使用的相关文章

jackson实现序列化的反序列化解析

现在项目开发过程中,字符串的传递成为前后端交互的主要方式,主要是因为字符串不会出现乱码等问题,传送方式是字节码传递,效率比实体较安全. 常见的Json类库有Gson.JSON-lib和Jackson,fastjson(阿里提供,自称效率最高的)等,Jackson相对来说比较高效,在项目中主要使用Jackson进行JSON和Java对象转换,下面给出一些Jackson的JSON操作方法. 一,下载jackson http://wiki.fasterxml.com/JacksonDownload 二

lua 对表的简单序列化与反序列化

参考文档:http://blog.csdn.net/xiaodan007/article/details/7096718 function sz_T2S(_t) local szRet = "{" function doT2S(_i, _v) if "number" == type(_i) then szRet = szRet .. "[" .. _i .. "] = " if "number" == ty

C#序列化与反序列化方式简单总结

相关类: System.SerializableAttribute特性(或称为属性), System.Runtime.Serialization.Iserializable(自定义序列化接口), System.Runtime.Serialization.IserializationSurrogate(自定义序列化代理接口), System.Runtime.Serializatin.SurrogateSelector(自定义序列化代理设置类) 1:官方备注 序列化使用 BinaryFormatte

访问修饰限定符的简单总结、final/abstruct/interface对类的限制、自动加载机制、序列化与反序列化【数据持久化和对象的序列化问题】、对象的拷贝(按引用是因为对象标识)和克隆(__clone方法中的this指向)

1.针对访问修饰限定符的理解只需要两点:(1)针对的是类的概念和访问代码的位置来确定是否能够访问(2)对访问修饰限定符的使用时只需要对该成员的使用场景注意即可[也就是内部,继承类,外部进行访问的权限] 不需要对内部进行太多理解[需要对php底层理解时进行理解] [重点][用途]通过访问修饰限定符将内部成员的权限合理的限制,然后再使用公共接口来调用这个基本服务,保证外部不能访问其内部的构件[这样既能够通过类内的设置,将内部的功能实现更好的限制,只有最外层的接口可以正常被访问到,而不了解内部的业务]

利用php的序列化和反序列化来做简单的数据本地存储

如下程序可以做为一个工具类 /** * 利用php的序列化和反序列化来做简单的数据本地存储 */ class objectdb { private static $db; //成功返回 objectdb 对象,不需要在外面使用new //目录需要写文件的权限 public function defaultdb($dbname='./default.db') { self::$db = $dbname; if(file_exists($dbname)) { return new objectdb(

高性能的序列化与反序列化:kryo的简单使用

前言:kryo是个高效的java序列化/反序列化库,目前Twitter.yahoo.Apache.strom等等在使用该技术,比如Apache的spark.hive等大数据领域用的较多. 为什么使用kryo而不是其他? 因为性能足够好.比kyro更高效的序列化库就只有google的protobuf了(而且两者性能很接近),protobuf有个缺点就是要传输的每一个类的结构都要生成对应的proto文件(也可以都放在同一个proto文件中,如果考虑到扩展性的话,不建议放在一个proto文件中),如果

Swifter.Json -- 在 .Net 平台上的一个功能强大,简单易用,稳定又不失高性能的 JSON 序列化和反序列化工具。

Swifter.Json Github Wiki 在 .Net 平台上的一个功能强大,简单易用,稳定又不失高性能的 JSON 序列化和反序列化工具. Swifter.Json 已经经过了大量测试和线上项目中运行许久来确保它的稳定性. 特性 1: 支持 .Net 上绝大多是的数据类型,且轻松扩展:包括但不限于:实体,字典,集合,迭代器,数据读取器和表格. 2: 支持 .Net 我已知的大多数平台,包括但不限于:.Net Framework 2.0+, .Net Core 2.0+, .Net St

Json.Net学习(1) 实现简单的序列化和反序列化

Attributes 可以用来控制Json.Net如何序列化和反序列化.Net对象. >JsonObjectAttribute--标记在类上,用于控制该类如何被序列化为一个Json对象(JSON Object) >JsonArrayAttribute--标记在集合上,用于控制该集合如何被序列化为一个Json集合(JSON Array) >JsonPropertyAttribute--标记在字段和属性上,用于控制它如何被序列化为一个Json对象中的属性 >JsonConverterA

简单Json序列化和反序列化

序列化是什么: 序列化就是将一个对象的状态(各个属性量)保存起来,然后在适当的时候再获得.序列化分为两大部分:序列化和反序列化.序列化是这个过程的第一部分,将数据分解成字节流,以便存储在文件中或在网络上传输.反序列化就是打开字节流并重构对象.对象序列化不仅要将基本数据类型转换成字节表示,有时还要恢复数据.恢复数据要求有恢复数据的对象实例. 序列化有什么特点: 如果某个类能够被序列化,其子类也可以被序列化.声明为static和transient类型的成员数据不能被序列化.因为static代表类的状