在常规的上位机编写中需要用到许多存储数据,存储对象的时候,我们存储数据的过程就是序列化,我们提取数据的过程就是反序列化。当然.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模型并赋值到变量中
}
序列化与反序列化的过程非常简单。序列化经常要用于保存各种各样的通用文件,使得上位机可以快捷的保存或者读取各类型的参数。