AE对象序列化
当我们编写AE程序时,通常会遇到需要存储某个AE对象的情况,比如Layer,Element,Map,Legend,NorthArrow等等这些。举个例子说明一下:在我们编辑Featurelayer时,我们可以容易的将Feature存储在Featureclass中;同样,如果我们向Graphicscontainer中添加了Element,我们也希望可以容易的存储Element,这样每次加载时可以将Element顺利显示出来,但是不巧的是,AE中并没有提供存储Element的方法。这个时候,我们就需要将Graphicscontainer序列化成文件,这样就可以达到存储的目的了。Featureclass存储成shapefile也好,Geodatabase也罢,都是一种文件的组织形式,也都是一种特殊意义上的序列化。
下面,介绍序列化的方法:
首先可以序列化的对象必须实现了IPersistStream接口,其中IPersistStream接口是Windos中的接口,派生自 IPersist,并增加了4个函数,从流(IStream)中读写组件属性信息。下面是各个函数的意义:
|
IsDirty() |
组件内部属性是否发生了变化。为调用者是否需要保存信息提供依据 |
|
Load() |
从 IStream 中读入信息,初始化组件属性 |
|
Save() |
把属性信息保存到 IStream 中 |
|
GetSizeMax() |
返回信息尺寸,以便调用者事先开辟空间 |
/// <summary>
/// ArcGIS对象序列化成二进制
/// </summary>
/// <param name="pObject"></param>
/// <returns></returns>
public static byte[] ReadObjectToBytes(object pObject)
{
byte[] defaultBytes = null;
if (pObject is IPersistStream)
{
IPersistStream persistStream = pObject as IPersistStream;
IObjectStream pObjStream = new ObjectStreamClass();
IMemoryBlobStream pBlobStream = new MemoryBlobStreamClass();
pObjStream.Stream = pBlobStream;
persistStream.Save(pObjStream, 0);
int n = (int)pBlobStream.Size;
defaultBytes = new byte[n];
object obj2 = null;
IMemoryBlobStreamVariant pBlobVariant = pBlobStream as IMemoryBlobStreamVariant;
pBlobVariant.ExportToVariant(out obj2);
defaultBytes = (byte[])obj2;
}
return defaultBytes;
}
/// <summary>
/// 二进制反序列化成ArcGIS对象
/// </summary>
/// <param name="bytes"></param>
/// <param name="pObject"></param>
public static void ReadObjectFromBytes(byte[] bytes, object pObject)
{
if (pObject is IPersistStream)
{
IPersistStream pPersistStream = pObject as IPersistStream;
IMemoryBlobStream2 pBlobStream = new MemoryBlobStreamClass();
pBlobStream.ImportFromMemory(ref bytes[0], (uint)bytes.Length);
IObjectStream pObjStream = new ObjectStreamClass();
pObjStream.Stream = pBlobStream;
pPersistStream.Load(pObjStream);
}
}
/// <summary>
/// 读取ArcGIS BLOB类型属性到byte数组
/// </summary>
/// <param name="blobValue">字段值</param>
/// <returns></returns>
public static byte[] ReadEsriBlobToBytes(object blobValue)
{
if (blobValue == null || blobValue == DBNull.Value)
{
return null;
}
IMemoryBlobStream2 pBlobStream = new MemoryBlobStreamClass();
pBlobStream = (IMemoryBlobStream2)blobValue;
int n = (int)pBlobStream.Size;
byte[] bytes = new byte[n];
object obj = null;
IMemoryBlobStreamVariant pBlobVariant = pBlobStream as IMemoryBlobStreamVariant;
pBlobVariant.ExportToVariant(out obj);
bytes = (byte[])obj;
return bytes;
}
/// <summary>
/// 将AE中实现了IPersistStream接口的对象序列化为二进制文件
/// </summary>
/// <param name="FilePath">如C:\file.blb</param>
/// <param name="pObject"></param>
/// <returns></returns>
public static bool WriteObj(string FilePath, object pObject)
{
bool result = false;
if (pObject is IPersistStream)
{
IPersistStream persistStream = pObject as IPersistStream;
IObjectStream pObjStream = new ObjectStreamClass();
IMemoryBlobStream pBlobStream = new MemoryBlobStreamClass();
pObjStream.Stream = pBlobStream;
persistStream.Save(pObjStream, 0);
try
{
pBlobStream.SaveToFile(FilePath);
result = true;
}
catch { }
}
return result;
}
/// <summary>
/// 序列化AE对象为字符串,在线程间传递
/// </summary>
public static string SerialsAEObject(IWorkspace pWorkspace)
{
try
{
IXMLStream pStream = new XMLStreamClass();
IXMLWriter pWriter = new XMLWriterClass();
pWriter.WriteTo(pStream as IStream);
IXMLSerializer pSerializer = new XMLSerializerClass();
//pWorkspace不能序列化,会报错
pSerializer.WriteObject(pWriter, null, null, "", "", pWorkspace.ConnectionProperties);
return pStream.SaveToString();
}
catch (Exception ex)
{
return "";
}
}
public static IWorkspace DeSerialsAEObject(string strObj,string PassWord)
{
try
{
IXMLStream pStream = new XMLStreamClass();
pStream.LoadFromString(strObj);
IXMLReader pReader = new XMLReaderClass();
pReader.ReadFrom(pStream as IStream);
IXMLSerializer pSerializer = new XMLSerializerClass();
IPropertySet pPropSet = pSerializer.ReadObject(pReader, null, null) as IPropertySet;
pPropSet.SetProperty("PASSWORD",PassWord);//反序列化后密码是空,需要重新赋值,要不会弹出连接参数界面
IWorkspaceFactory workspaceFactory = new ESRI.ArcGIS.DataSourcesGDB.SdeWorkspaceFactoryClass();
IWorkspace pWS = workspaceFactory.Open(pPropSet, 0);
return pWS;
}
catch (Exception ex)
{
return null;
}
}
AE对象序列化的更多相关文章
- Java对象序列化剖析
对象序列化的目的 1)希望将Java对象持久化在文件中 2)将Java对象用于网络传输 实现方式 如果希望一个类的对象可以被序列化/反序列化,那该类必须实现java.io.Serializable接口 ...
- 理解Java对象序列化
http://www.blogjava.net/jiangshachina/archive/2012/02/13/369898.html 1. 什么是Java对象序列化 Java平台允许我们在内存中创 ...
- java 对象序列化与反序列化
Java序列化与反序列化是什么? 为什么需要序列化与反序列化? 如何实现Java序列化与反序列化? 本文围绕这些问题进行了探讨. 1.Java序列化与反序列化 Java序列化是指把Java对象转换为 ...
- C#对象序列化与反序列化zz
C#对象序列化与反序列化(转载自:http://www.cnblogs.com/LiZhiW/p/3622365.html) 1. 对象序列化的介绍........................ ...
- C#对象序列化与反序列化
C#对象序列化与反序列化(转载自:http://www.cnblogs.com/LiZhiW/p/3622365.html) 1. 对象序列化的介绍.......................... ...
- powershell读写磁盘变量(对象序列化)
---[第一章,开篇引子]--- 很久很久以前,我在网上闲逛,看到一头powershell菜鸟,写了一篇感慨道“挖哈哈,我学会powershell啦,我以前很笨,各种不懂,还想把变量保存起来.” 实际 ...
- Java对象序列化---转载
1.概念 序列化:把Java对象转换为字节序列的过程. 反序列化:把字节序列恢复为Java对象的过程. 2.用途 对象的序列化主要有两种用途: 1) 把对象的字节序列永久地保存到硬盘上,通常存放在一个 ...
- 【译】Java中的对象序列化
前言 好久没翻译simple java了,睡前来一篇. 译文链接: http://www.programcreek.com/2014/01/java-serialization/ 什么是对象序列化 在 ...
- Java对象序列化文件追加对象的问题,以及Java的读取多个对象的问题解决方法。
这几天做一个小的聊天项目用到对象序列化的知识,发现对象序列化不能像普通文件一样直接追加对象.每次写入对象都会被覆盖.弄了2个多小时终于解决了.Java默认的对象序列化是每次写入对象都会写入一点头ace ...
- I/O 流和对象序列化
一.I/O 流(java 如何实现与外界数据的交流) 流定义: 任何有能力产出数据的数据源对象或者有能力接收数据的数据源对象.他屏蔽了实际的I/O设备处理数据的细节. 1.Input/Output:指 ...
随机推荐
- Windows系统环境变量
添加环境变量: 添加系统变量,机器要重新启动 添加用户变量,机器不用重启: 一般添加环境变量都添加在用户变量中,但只针对这一用户生效 为了使的所有用户都能正常使用软件,通常添加系统变量
- 为什么用 AWS CLI?因为我懒得点鼠标!
在这篇博客中,我们一起深入探索 AWS CLI 的世界,从零开始,逐步构建在云端的家园.将介绍 AWS CLI 的基本功能和使用场景,如何创建 IAM 用户.VPC.子网.安全组.EC2 实例等,甚至 ...
- find_sys_call_table和kallsysms_lookup_name的区别
find_sys_call_table 和 kallsyms_lookup_name 都可以用于查找内核符号,但它们的具体作用和使用场景有所不同.以下是两者的详细对比: 1. find_sys_cal ...
- C++ 第三节课 指针的使用
#include <iostream> using namespace std; void show(){ cout << "全局函数" << ...
- kotlin更多语言结构——>类型安全的构建器
通过使用命名得当的函数作为构建器,结合带有接收者的函数字面值,可以在 Kotlin 中创建类型安全.静态类型 的构建器 类型安全的构建器可以创建基于 Kotlin 的适用于采用半声明方式构建复杂层次数 ...
- kotlin协程——>异常处理
异常处理 本节内容涵盖了异常处理与在异常上取消.我们已经知道取消协程会在挂起点抛出 CancellationException 并且它会被协程的机制所忽略.在这⾥我们会看看在取消过程中抛出异常或同 ⼀ ...
- KubeSphere 部署向量数据库 Milvus 实战指南
作者:运维有术星主 Milvus 是一个为通用人工智能(GenAI)应用而构建的开源向量数据库.它以卓越的性能和灵活性,提供了一个强大的平台,用于存储.搜索和管理大规模的向量数据.Milvus 能够执 ...
- KubeSphere 社区双周报 | FluentBit 新增 tcp 输入插件 | 2023.09.29-10.12
KubeSphere 社区双周报主要整理展示新增的贡献者名单和证书.新增的讲师证书以及两周内提交过 commit 的贡献者,并对近期重要的 PR 进行解析,同时还包含了线上/线下活动和布道推广等一系列 ...
- 云原生周刊:K8s v1.28 中的结构化身份验证配置
开源项目推荐 KubeLinter KubeLinter 是一种静态分析工具,用于检查 Kubernetes YAML 文件和 Helm 图表,以确保其中表示的应用程序遵循最佳实践. DB Opera ...
- vue axios的使用及操作
引入axios 并设置原型 Vue.prototype.$axios = axios; 在其他地方就可以this.$axios使用了 let param = _this.$qs.string ...