ArcEngine 内部封装对象的序列化

当我们编写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;
            }
        }

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值