Netron开发快速上手(二):Netron序列化

Netron是一个C#开源图形库,可以帮助开发人员开发出类似Visio的作图软件。本文继前文”Netron开发快速上手(一)“讨论如何利用Netron里的序列化功能快速保存自己开发的图形对象。

一个用Netron开发的实际应用请看:发布一个免费开源软件-- PAD流程图绘制软件PADFlowChart

一、      Netron对象序列化

序列化Netron对象需要以下几个步骤:

  • 添加序列化标签]Serializable]
    [Serializable]

    public class BlockShape : AbstractFlowChartShape
  • 实现ISerializable接口

如果是从Shape类或Entity类(Shape类的父类)继承,则已经继承了ISerializable接口,你需要做的就是重载GetObjectData方法,该方法用于序列化时被序列化过程调用,提供要序列化的数据

        public override void GetObjectData(SerializationInfo info, StreamingContext context)

        {

            base.GetObjectData(info, context);

            info.AddValue("m_leftConnector", m_leftConnector);

                       …

        }

GetObjectData方法要先调用基类的方法,否则基类的数据不会被序列化。

用info.AddValue()加入你要序列化的数据

  • 实现序列化的构造函数

类的序列化构造函数用于反序列化对象。当从磁盘读取序列化数据时,用于生成相应的对象。下面是个例子:

        protected BlockShape(SerializationInfo info, StreamingContext context) : base(info, context)

        {

            m_leftConnector = (Connector)info.GetValue("m_leftConnector", typeof(Connector));

            m_leftConnector.BelongsTo = this;

            Connectors.Add(m_leftConnector);

                       …

        }

a) 注意要调用基类的序列化构造函数。

b) 用info.GetValue(“<数据名字>”,<数据类型>)来反序列化数据

  • 必要时重载IEntity:PostDeserialization()方法

IEntity::PostDeserialization()方法将会在Netron的反序列化过程中被Netron.GraphLib.IO.Binary.BinarySerializer::UnwrapBundle()方法调用,调用的时机是所有对象建立以后。在这里你可以做一些初始化工作。因为反序列化时除了序列化构造函数其它的构造函数是不会被调用的。

二、      添加“打开/保存”代码

添加了图形对象的序列化代码后,你还需要在自己的应用程序中对“打开/保存”菜单命令添加相应的代码来打开/保存你的数据

  • 打开文件:

   GraphControl::Open()

  • 保存文件:

   GraphControl::SaveAs()

另外你可以用GraphControl::IsDirty来判断目前画布上的图形对象是否已经发生了改变需要保存;

GraphControl::OnDirtyChanged事件可以在画布上的内容发生改变后通知开发人员做相应的处理。

、      Netron序列化过程分析

  • Netron的序列化过程如下:

GraphControl:: SaveAs()

=>IO.Binary.BinarySerializer::SaveAs()

=> BinaryCapsule:: GetObjectData()

=>GraphAbstract:: GetObjectData()

而在GraphAbstract:: GetObjectData()里则分别序列化了其中的Shapes和Connections,对集合Shapes和Connections的序列化会导致Shape及Connection的GetObjectData()方法被调用。

  • Netron的反序列化过程如下:

GraphControl:: Open

=> IO.Binary.BinarySerializer:: Open()

=> BinaryFormatter:: Deserialize()

BinaryFormatter:: Deserialize()将会在读取序列化文件时调用相应对象的序列化构造函数进行反序列化。和前述序列化过程相反,反序列化过程会先调用Shape和Connection的序列化构造函数生成Shapes和Connections集合,然后调用GraphAbstract的序列化构造函数生成GrapAbstract对象,然后生成BinaryCapsule对象。

随后IO.Binary.BinarySerializer:: Open()将调用UnwrapBundle()方法,使Connection和Shape的Connector连接起来。因为在Netron中,Shape通过Connection相连,而Connection的From/To都指向Shape的Connector成员,在序列化过程中,Connector对象是在Shape中进行序列化,而Connection则只序列化了From/To的UID(String类型); UnwrapBundle()方法将对每一个Connection对象查找和From UID/To UID匹配的Connector,然后将Connection的From/To指向相应的Connector对象。

最后,在UnwrapBundle()方法中还会调用Shape和Connection的PostDeserialization()。

时间: 2024-11-06 18:15:16

Netron开发快速上手(二):Netron序列化的相关文章

Netron开发快速上手(上)

版权所有,引用请注明出处:<<http://www.cnblogs.com/dragon/p/5203663.html >> 本文所用示例下载FlowChart.zip 一.      概述 Netron是一个开源的图形开发库,它还有一个轻量级的版本叫NetronLight,本文不讨论NetronLight. 在NetronGraphLib里,需要重点理解的是四个类,这四个类理解了,NetonGraphLib就掌握了大半部分: GraphControl:代表的是画布对象,所有的图形

python爬虫框架之scrapy的快速上手 二

scrapy快速上手之crawl模板 前面提到过,我们使用了basic作为模板生成了爬虫 现在介绍另外一种模板:crawl 创建项目 首先在命令行界面执行: scrapy startproject Spider 后,即可得到提示 You can start your first spider with: cd Spider scrapy genspider example example.com 然后,根据提示在命令继续输入cd Spider 这样,我们就来到了所创建爬虫的工作目录下 前面已经介

Swift开发快速上手系列教程目录-陆续完善,由浅入深

Swift开发教程 一.Swift基础 Swift教程01-使用switfc终端命令编译运行swift程序 Swift教程02-抓住下一个浪潮之巅 Swift教程03-playground剖析swift语言 Swift教程04-定义声明变量重要原则 Swift教程05-基本数据类型(一)整型浮点型 Swift教程06-基本数据类型(二)Bool布尔类型对比Java-boolean,Objc-BOOL Swift教程07-基本数据类型(三)元组类型tuple Swift教程08-基本数据类型(四)

php扩展开发-快速上手

系统环境CentOS release 6.5 (Final) PHP版本php-5.6.27 扩展开发需要有php环境及php的源代码,我的PHP安装目录/home/zhangxiaomin/study/php5627/,源码目录/home/zhangxiaomin/study/php-5.6.27, ln -s /home/zhangxiaomin/study/php5627/bin/php /home/zhangxiaomin/bin/php5.6 做一个软连接用php5.6代替/home/

Java开发快速上手

前言 1.我的大学 2.对初学者的建议 3.大牛的三大特点 4.与他人的差距 第一章 了解Java开发语言 前言 基础常识 1.1 什么是Java 1.1.1 跨平台性 1.2 如何搭建Java运行环境 1.2.1 了解JDK与JRE 1.2.2 jdk下载与安装 1.2.3 配置开发环境 1.3 如何写Java代码 1.3.1 我的第一个Java程序 1.5 注解的使用 1.6 思维导图 第二章 变量_常量_运算符 2.1 什么是变量 2.1.2 如何声明变量 2.1.3 变量名的命名规则 2

PhalApi 2.7 开发快速上手

PhalApi是一款国人制作的PHP纯后端框架.它的开发相当简单,同时也具备文档生成等特色功能.下面,我通过简单的几点,让你可以快速入门使用该框架的开发. 建议使用PHPStorm作为IDE,代码提示相当完全.由于PHP的热更新特性,修改过的PHP文件保存后立即生效,无需编译,无需重启服务器. 什么是PhalApi PhalApi是一个轻量级的PHP接口框架.有别于传统的框架,它只面向后端接口的开发. 官网:https://www.phalapi.net 官方文档:http://docs.pha

FastAdmin模块开发快速上手

下载FASTADMIN地址: https://www.fastadmin.net/download.html FASTADMIN开发文档地址:https://doc.fastadmin.net/docs/index.html fastAdmin   https://www.jianshu.com/search?q=FastAdmin&page=1&type=note 例子: 第一步: 在数据库中创建一个hysj_member用户列表 表结构如下: 注意: 1.用户名字段必须唯一,不能重复(

Extjs视频教程_快速上手Extjs4.2实战开发

Extjs视频教程_快速上手Extjs4.2实战开发快速上手Extjs4.2并熟练搭建基于MVC4+FluentData+Spring.net和T4模板的企业级项目架构适合人群:中级课程分类:.NET+ExtJs课时数量:76课时用到技术:Extjs4.2,MVC4,FluentData,T4,Spring.net涉及项目:基于Extjs4.2的丰富案例.一个独立的企业级架构和综合演示案例咨询qq:1840215592 Extjs视频教程课程大纲:(1)Extjs4.2理论部分(风舞烟老师老师主

android快速上手(二)android开发环境搭建及hello world

基本了解了java语法,下一步,我们一起开启hello world的神秘之旅. (一)android开发环境搭建 之前搭建android开发环境是件非常费力的事情,下载Eclipse,安装ADT等,如今android官方给我们提供了全套配置. https://developer.android.com/sdk/index.html 搭建android开发环境之前记得先安装jdk (二)开启Hello World之旅 (1)创建Hello World项目 安装完带ADT的Eclipse,打开Ecl