当我们编写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. SQL通用语法与分类

    通用语法 1.SQL可以单行或多行书写,以分号结尾. 2.MySQL数据库的SQL语句不区分大小写,关键字建议使用大写. 3.注释 1)单行注释: -- 注释内容  或 # 注释内容(MySQL特有) ...

  2. MyBatis——使用Mapper代理开发

    使用 Mapper 代理开发方式完成入门案例   1.定义与SQL映射文件同名的Mapper接口,并将 Mapper 接口和SQL映射文件放置在同一目录下       (企业开发中,通常是将配置文件统 ...

  3. Flutter 2.5 更新详解

    Flutter 2.5 正式版已于上周正式发布!这是一次重要的版本更新,也是 Flutter 发布历史上各项统计数据排名第二的版本.我们关闭了 4600 个 Issue,合并了 3932 个 PR,它 ...

  4. cortex-m3 m4 异常机制

    文章写的很好,待整理 1.[STM32]HardFault问题详细分析及调试笔记 https://blog.csdn.net/m0_54916619/article/details/129979222 ...

  5. 以后基于 Topass 的博客加密方法通告

    Topass 加密方法 以后会将部分未公开内容公开,请你通过此加密途径来破解密码 特别地,为了保证博客的浏览体验,我不会通过这种方法加密任何一种应该公开的文章 话说你们不妨猜猜用的什么算法

  6. PostgreSQL 15 新特性解读 | 墨天轮优质文章合集

    5月19日,PostgreSQL 全球开发组宣布 PostgreSQL 15 的第一个 beta 版本,这一新版本在开发者体验.性能表现等方面都有提升.为了帮助大家更快速了解到PostgreSQL 1 ...

  7. iOS开发中UITextView使用小结

    最近项目开发中用到了多行文本框限制文字输入个数限制,之前的话在textViewDidChange方法中截取超出字数就可以.测试人员发现在拼音转汉字的过程中,YYTextView不会二次确认textVi ...

  8. 我对CMD 和 AMD 的理解 ?

    都是模块规范,和 CommonJs 一样都是社区规范,ES-module 才是官方规范,而且官方规范是趋势 : AMD:Asynchronous Module Definition  异步模块定义,即 ...

  9. C#查漏补缺----Exception处理实现,无脑抛异常不可取

    前言 环境:.NET 8.0 系统:Windows11 参考资料:CLR via C#, .Net Core底层入门 https://andreabergia.com/blog/2023/05/err ...

  10. Python之爬虫-全民k歌

    import re import os import requests from aip import AipSpeech from pydub import AudioSegment APP_ID ...