当我们编写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对象序列化的更多相关文章

  1. Java对象序列化剖析

    对象序列化的目的 1)希望将Java对象持久化在文件中 2)将Java对象用于网络传输 实现方式 如果希望一个类的对象可以被序列化/反序列化,那该类必须实现java.io.Serializable接口 ...

  2. 理解Java对象序列化

    http://www.blogjava.net/jiangshachina/archive/2012/02/13/369898.html 1. 什么是Java对象序列化 Java平台允许我们在内存中创 ...

  3. java 对象序列化与反序列化

    Java序列化与反序列化是什么? 为什么需要序列化与反序列化? 如何实现Java序列化与反序列化? 本文围绕这些问题进行了探讨. 1.Java序列化与反序列化  Java序列化是指把Java对象转换为 ...

  4. C#对象序列化与反序列化zz

      C#对象序列化与反序列化(转载自:http://www.cnblogs.com/LiZhiW/p/3622365.html) 1. 对象序列化的介绍........................ ...

  5. C#对象序列化与反序列化

    C#对象序列化与反序列化(转载自:http://www.cnblogs.com/LiZhiW/p/3622365.html) 1. 对象序列化的介绍.......................... ...

  6. powershell读写磁盘变量(对象序列化)

    ---[第一章,开篇引子]--- 很久很久以前,我在网上闲逛,看到一头powershell菜鸟,写了一篇感慨道“挖哈哈,我学会powershell啦,我以前很笨,各种不懂,还想把变量保存起来.” 实际 ...

  7. Java对象序列化---转载

    1.概念 序列化:把Java对象转换为字节序列的过程. 反序列化:把字节序列恢复为Java对象的过程. 2.用途 对象的序列化主要有两种用途: 1) 把对象的字节序列永久地保存到硬盘上,通常存放在一个 ...

  8. 【译】Java中的对象序列化

    前言 好久没翻译simple java了,睡前来一篇. 译文链接: http://www.programcreek.com/2014/01/java-serialization/ 什么是对象序列化 在 ...

  9. Java对象序列化文件追加对象的问题,以及Java的读取多个对象的问题解决方法。

    这几天做一个小的聊天项目用到对象序列化的知识,发现对象序列化不能像普通文件一样直接追加对象.每次写入对象都会被覆盖.弄了2个多小时终于解决了.Java默认的对象序列化是每次写入对象都会写入一点头ace ...

  10. I/O 流和对象序列化

    一.I/O 流(java 如何实现与外界数据的交流) 流定义: 任何有能力产出数据的数据源对象或者有能力接收数据的数据源对象.他屏蔽了实际的I/O设备处理数据的细节. 1.Input/Output:指 ...

随机推荐

  1. Nuxt Kit 中的布局管理

    title: Nuxt Kit 中的布局管理 date: 2024/9/18 updated: 2024/9/18 author: cmdragon excerpt: 摘要:本文详述了在Nuxt.js ...

  2. SpringMVC —— 入门案例执行流程

    启动服务器初始化过程 1.服务器启动,执行ServletContainersInitConfig类,初始化web容器    2.执行createServletApplicationContext方法, ...

  3. Vue 调用后台接口导出Excel

    vue 调用后台接口生成 Excel 咱也不会前端,就是现学现卖. Js export function exportOnlyB(reportId) { return request({ url: & ...

  4. 【赵渝强老师】MongoDB中的索引(上)

    索引是提高查询查询效率最有效的手段.索引是一种特殊的数据结构,索引以易于遍历的形式存储了数据的部分内容(如:一个特定的字段或一组字段值),索引会按一定规则对存储值进行排序,而且索引的存储位置在内存中, ...

  5. iOS中修饰符常用小结

    1.copy,是复制引用对象地址的深拷贝 a:当修饰不可变类型的属性时,如NSArray.NSDictionary.NSString,用copy,用copy为关键字的话,调用setter方法后.是对赋 ...

  6. C#的引用类型

    引用类型的基类为 Object 引用类型:类Class.接口Interface.委Delegrate.数组Array

  7. otdolist 案例

    1. 渲染默认任务 2. 回车添加任务 3. 删除任务 4. 底部任务数量 5.  tab栏切换 6. tab切换显示不同任务 7. 清除已完成的任务 8.  头部全选 9. 删除任务

  8. 云原生的 WebAssembly 能取代 Docker 吗?

    WebAssembly 是一个可移植.体积小.加载快并且兼容 Web 的全新格式.由于 WebAssembly 具有很高的安全性,可移植性,效率和轻量级功能,因此它是应用程序安全沙箱方案的理想选择.现 ...

  9. 用easyVget下载B站油管视频

    B站油管等视频平台简直就是无所不有的宝库,动漫.番剧.纪录片.科普,更有海量的学习资源,可以极大地满足你的视觉欲和求知欲. 作为一只视频仓鼠,我热衷于下载自己感兴趣的视频到本地,不用担心视频被和谐.不 ...

  10. 经典排序算法(C语言、Java版)

    排序 比较 分类 比较排序的时间复杂度的下界O(nlogn) 对于n个待排序元素,在未比较时,可能的正确结果有n!种.在经过一次比较后,其中两个元素的顺序被确定,所以可能的正确结果剩余n!/2种(确定 ...