在ArcObjects SDK,序列化接口是IPersistStream,该接口的定义如下。

其中GetClassID函数可以获取实际类型的唯一ID,Load函数是反序列化函数,Save函数为序列化函数。我们看下Load和Save函数是接收什么参数。

Save函数的定义如下所示。

public void Save (IStream pstm,int fClearDirty);
public void Load (IStream pstm);

Save函数传入IStream接口类型的对象,第二个参数是否清空该对象的脏状态。Load函数也是传入一个IStream接口类型的对象。IStream的定义如下。

从帮助中看出只有一个XMLStream继承实现了IStream接口,但实际操作的时候,保存的xml字符串会有乱码,想把这些字符串分序列化回去的时候,会报错。这个问题估计是有其他办法解决,但我一直没有找到解决办法,所以此路走不通。

实际上,除了XMLStream外,还有ESRI.ArcGIS.esriSystem.MemoryBlobStreamClass类也继承IStream接口,但不知道为什么帮助里面没有体现出来。从MemoryBlobStreamClass的命名也可以看出,使用这个类可以保存成二进制,也就是byte[],然后我们把byte[]转换成字符串就可以和其他信息一起保存成文件或者xml中的一个节点了。

序列化代码如下。

public static string ToPersistString(IPersistStream pPersistStream)
{
if (pPersistStream == null)
{
return "";
}
//得到ClassGuid
pPersistStream.GetClassID(out Guid myClassGuid);
string myClassGUID = myClassGuid.ToString();
//得到二进制信息
IMemoryBlobStream myMemoryBlobStream = new MemoryBlobStreamClass();
pPersistStream.Save(myMemoryBlobStream, 0);
IMemoryBlobStreamVariant myMemoryBlobStreamVariant = myMemoryBlobStream as IMemoryBlobStreamVariant;
myMemoryBlobStreamVariant.ExportToVariant(out object myObject);
return myClassGUID + "," + Convert.ToBase64String(myObject as byte[]);
}

需要注意的是,我们除了得到byte[]之外,还需要得到该对象所属类的ClassGUID,通过IPersistStream的GetClassID函数可以获取到,获取之后,和byte[]一起保存成字符串。只有知道这段信息保存的是哪个类的实例,才能实例化出一个对象,并把该对象转换成IPersistStream接口,最后调该接口的Load函数加载信息。

反序列化的代码如下。

public static IPersistStream FromPersistString(string pPersistString)
{
if (pPersistString.Trim().Length == 0)
{
return null;
}
string[] myPersistArray = pPersistString.Split(',');
if (myPersistArray.Length < 1)
{
throw new ArgumentException("AoSerializer error.");
} Type myType = Type.GetTypeFromCLSID(new Guid(myPersistArray[0]));
IPersistStream myPersistStream = Activator.CreateInstance(myType) as IPersistStream; byte[] myByteArray = Convert.FromBase64String(myPersistArray[1]);
IMemoryBlobStream myMemoryBlobStream = new MemoryBlobStreamClass();
IMemoryBlobStreamVariant myMemoryBlobStreamVariant = myMemoryBlobStream as IMemoryBlobStreamVariant;
myMemoryBlobStreamVariant.ImportFromVariant(myByteArray);
myPersistStream.Load(myMemoryBlobStream);
return myPersistStream;
}

反序列化代码首先先把ClassGUID和byte[]对应的字符串分类,通过调用Type.GetTypeFromCLSID(new Guid(myPersistArray[0]));函数,可以获取具体的类型,然后通过Activator.CreateInstance(myType)函数实例化一个该类型的对象,当然该对象肯定是继承了IPersistStream接口的。

有了对象,有了数据,最后调用 myPersistStream.Load(myMemoryBlobStream);加载数据中的信息,也就是把数据中存储的信息赋给调用的对象。

一般来说,我会把保存的字符串作为大xml文件的一个属性或者节点存储,如下所示。

在第6行,定义了TextSymbol属性,该属性存储了继承ITextSymbol接口的对象,至于是哪个类,靠“,”号前面的的GUID字符串去识别,“,”号后面就是存储的具体数据。

第8行定义了MapSurroundFrame属性,该属性下存储了一个IMapSurroundFrame接口类型的对象,解析方法和TextSymbol一样。

ArcObjects SDK开发 025 AO中对象的序列化和反序列化的更多相关文章

  1. java中对象的序列化和反序列化

    [对象的序列化和反序列化 ] 1.定义:序列化--将对象写到一个输出流中.反序列化则是从一个输入流中读取一个对象.类中的成员必须是可序列化的,而且要实现Serializable接口,这样的类的对象才能 ...

  2. Java对象的序列化与反序列化

    序列化与反序列化 序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程.一般将一个对象存储至一个储存媒介,例如档案或是记亿体缓冲等.在网络传输过程中,可以是字节或是 ...

  3. 一文带你全面了解java对象的序列化和反序列化

    摘要:这篇文章主要给大家介绍了关于java中对象的序列化与反序列化的相关内容,文中通过详细示例代码介绍,希望能对大家有所帮助. 本文分享自华为云社区<java中什么是序列化和反序列化?>, ...

  4. 第12讲-Java中的IO操作及对象的序列化与反序列化

    1.知识点 1.1.课程回顾 1.2.本章重点 1.2.1  io操作 1.2.2  对象的序列化与反序列化 2.具体内容 2.1.Java IO 2.1.1.什么是IO IO其实就是输入.输出 I ...

  5. (记录)Jedis存放对象和读取对象--Java序列化与反序列化

    一.理论分析 在学习Redis中的Jedis这一部分的时候,要使用到Protostuff(Protobuf的Java客户端)这一序列化工具.一开始看到序列化这些字眼的时候,感觉到一头雾水.于是,参考了 ...

  6. Asp.net中Json的序列化和反序列化(一)

    JSON是专门为浏览器中的网页上运行的JavaScript代码而设计的一种数据格式.在网站应用中使用JSON的场景越来越多,本文介绍ASP.NET中JSON的序列化和反序列化,主要对JSON的简单介绍 ...

  7. ASP.NET中JSON的序列化和反序列化

    JSON是专门为浏览器中的网页上运行的JavaScript代码而设计的一种数据格式.在网站应用中使用JSON的场景越来越多,本文介绍 ASP.NET中JSON的序列化和反序列化,主要对JSON的简单介 ...

  8. ASP.NET 中JSON 的序列化和反序列化

    JSON是专门为浏览器中的网页上运行的JavaScript代码而设计的一种数据格式.在网站应用中使用JSON的场景越来越多,本文介绍ASP.NET中JSON的序列化和反序列化,主要对JSON的简单介绍 ...

  9. Java对象的序列化和反序列化[转]

    Java基础学习总结--Java对象的序列化和反序列化 一.序列化和反序列化的概念 把对象转换为字节序列的过程称为对象的序列化.把字节序列恢复为对象的过程称为对象的反序列化. 对象的序列化主要有两种用 ...

  10. Asp.Net中JSON的序列化和反序列化-----JavaScriptSerializer ,加上自己工作心得

    在工作中和手机通信用到web服务和javascriptSerializer,返回json数据,供手机端调用,一开始返回的数据是一大堆,比如 [{"word_picture9":&q ...

随机推荐

  1. Hadoop生态系统—数据仓库Hive的安装

    一.数据仓库 数据仓库是一个面向主题的.集成的.随时间变化,但信息本身相对稳定的数据集合,相比于传统型数据库,它主要用于支持企业或组织的决策分析处理.主要有以下3个特点: 数据仓库是面向主题的: 数据 ...

  2. IDEA生成带参数和返回值注释

    步骤说明 打开IDEA进入点击左上角 - 文件 - 设置 - 编辑器 - 活动模板 新建活动模板 填写模板文本 编辑变量 添加变量表达式 设置模板使用范围-设置全部范围应用-或者设置只在Java代码中 ...

  3. 测试杂谈——一条SQL引发的思考(二)

    在前段时间,曾写过一篇关于SQL问题的文章,测试杂谈--一条SQL引发的思考(一). 今天这篇,算是个问题记录吧,问题并不复杂,但对于测试同学而言,确实是个需要关注的点. 问题分析 最近在日常工作中, ...

  4. HDFS追加数据报错解决办法

    主要的两个错误,今天晚上一直轮着报: 第一个 2022-10-25 21:37:11,901 WARN hdfs.DataStreamer: DataStreamer Exception java.i ...

  5. AIR32F103(三) Linux环境基于标准外设库的项目模板

    目录 AIR32F103(一) 合宙AIR32F103CBT6开发板上手报告 AIR32F103(二) Linux环境和LibOpenCM3项目模板 AIR32F103(三) Linux环境基于标准外 ...

  6. (数据科学学习手札146)geopandas中拓扑非法问题的发现、诊断与修复

    本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 大家好我是费老师,geopandas作为在Pyt ...

  7. shell脚本之一键部署openV~P~N

    提前准备:/root目录下: checkpsw.sh ## 官方提供的自定义脚本,可在http://openvpn.se/files/other/checkpsw.sh下载 openvpn@.serv ...

  8. PageRank原理分析

    pagerank是将众多网页看成一个有向图,每个页面就是有向图中的节点.计算每个节点的出度和入度.如果一个网站被大量其他的网页引用,那么他就会有更高的pr分数. 原理 对于所有与节点i相连的节点,用他 ...

  9. Golang 和Python 几个小时前 几分钟 几天前的处理

    在用golang爬虫的时候 总会遇到 10天前 10分钟前 刚刚这种很影响我们爬取正常事件 所以我写了个方法 来格式化这种事件 golang 版本 package utils import ( &qu ...

  10. clang在编译时指定目标文件所需的最低macOS版本

    调研这个的原因,是因为有个同事在macOS 12.2上打包好的程序,放在macOS 10.15上运行时报错: Dyld Error Message:  Symbol not found: __ZNKS ...