上位机模块之序列化与反序列化,二进制序列化

在常规的上位机编写中需要用到许多存储数据,存储对象的时候,我们存储数据的过程就是序列化,我们提取数据的过程就是反序列化。当然.net为我们提供了一个可读与不可读(二进制)的序列化方式,在这里我主要说明和记录不可读序列化形式。
在计算机中,任何数据的本质都是二进制编码的数据,所以我们在使用二进制序列化时可以将任意的数据进行序列化。其中尤为重要的是我们在halcon中的Hobject与Htuple对象同样可以被序列化。在halcon中自带的算子提供了许多序列化方式,当然都是针对某些特殊的形式,比如模板匹配的模板文件.shm或者仿射变换矩阵等。由于他们本质上都是二进制的数据,所以在使用.net的序列化时,我们可以将我们的模块文件(Halconhandle)进行序列化保存。
我们可以在网上直接下载Newtonsoft.Json的DLL文件即可,在项目中引用。
先上代码:

namespace ModuleInPack
{
    [Serializable]//将类标记为可序列化类
    public class Serialization
    {
        [Serializable]//将结构体标记为可序列化
        public struct MarkPoint
        {
            public Calibration calibration;//在访问结构体中的结构体时,需新建对象
            public Model model;
            [Serializable]//将结构体标记为可序列化
            public struct Calibration
            {
                public HTuple Calibration1 { get; set; }//被序列化的Htuple对象(标定的仿射变换矩阵)
                public double SpinCenterX { get; set; }
                public double SpinCenterY { get; set; }
            }
            [Serializable]
            public struct Model
            {
                public List<HTuple> ModelHandels { get; set; }//模板匹配的模板句柄
                public List<HObject> ModelMatchRoi1 { get; set; }//模板匹配的ROI框
            }
     }
}
//保存序列化文件
Serialization.MarkPoint Now_Mark = new Serialization.MarkPoint();
Now_Mark.model.ModelHandels= Model;//模板句柄
BinaryFormatter formatter = new BinaryFormatter();
//将序列化文件保存在指定路径中
using (var fs = new FileStream("Serialization\\1.ModuleInPack", FileMode.OpenOrCreate))
{
   //序列化到文件
   formatter.Serialize(fs, Now_Mark);
}
//反序列化文件
using (var fs = new FileStream("Serialization\\1.ModuleInPack", FileMode.OpenOrCreate))
{
       Now_Mark = (Serialization.MarkPoint)formatter.Deserialize(fs);
       Model=Now_Mark.model.ModelHandels;//读取序列化的halcon模型并赋值到变量中
}

序列化与反序列化的过程非常简单。序列化经常要用于保存各种各样的通用文件,使得上位机可以快捷的保存或者读取各类型的参数。

你可能感兴趣的:(C#,上位机,c#)