ArcObject对象序列化和反序列化

因为AO对象不支持跨线程,所以当开发多线程应用时,需要将AO对象序列化为字符串(本文只介绍序列化为字符串的情形),然后将序列化字符串传递给工作线程,最后在工作线程里将序列化字符串反序列化为AO对象执行相关操作。

AO对象按序列化方式可分为两种:

1、实现IXMLSerialize接口的类(此处为IXMLSerialize而不是IXMLSerializer)

2、实现IPersistStream接口的类

1、实现IXMLSerialize接口的类的序列化和反序列化

        /// <summary>
        /// 实现IXMLSerialize接口的类的序列化
        /// </summary>
        /// <param name="obj">要序列化的对象</param>
        /// <returns>序列化后的字符串</returns>
        private string SerialzedXMLSer(object obj)
        {
            string serStr = null;
            try
            {
                //此处为IXMLSerializer不是IXMLSerialize(有r)
                IXMLSerializer xmlSerializer = new XMLSerializerClass();
                serStr = xmlSerializer.SaveToString(obj, null, null);            
            }
            catch { }
            return serStr;
        }

        /// <summary>
        /// 实现IXMLSerialize接口的类的反序列化
        /// </summary>
        /// <param name="serStr">序列化字符串</param>
        /// <returns>反序列化得到的对象</returns>
        private object DeSerialzedXMLSer(string serStr)
        {
            object obj = null;
            try
            {
                ///反序列化
                IXMLSerializer xmlSerializer = new XMLSerializerClass();
                obj = xmlSerializer.LoadFromString(serStr, null, null);
            }
            catch { }
            return obj;
        }

2、实现IPersistStream接口的类的序列化和反序列化

  此种序列化和反序列化方式多用到IXMLPersistedObject接口

        /// <summary>
        /// 序列化实现IPersistStream接口的对象
        /// </summary>
        /// <param name="obj">要序列化的对象</param>
        /// <returns>序列化后的字符串</returns>
        private string SerialzedPersist(object obj)
        {
            string serStr = null;
            try
            {
                //序列化
                IXMLPersistedObject xmlWrapper = new XMLPersistedObjectClass();
                xmlWrapper.Object = obj;
                IXMLSerializer xmlSerializer = new XMLSerializerClass();
                serStr = xmlSerializer.SaveToString(xmlWrapper, null, null);
            }
            catch { }
            return serStr;
        }

        /// <summary>
        /// 反序列化实现IPersistStream接口的对象
        /// </summary>
        /// <param name="serStr">序列化字符串</param>
        /// <returns>反序列化得到的对象</returns>
        private object DeSerialzedPersist(string serStr)
        {
            object obj = null;
            try
            {
                ///反序列化
                IXMLSerializer xmlSerializer = new XMLSerializerClass();
                IXMLPersistedObject deWrapper = xmlSerializer.LoadFromString(serStr, null, null) as IXMLPersistedObject;
                obj = deWrapper.Object;
            }
            catch { }
            return obj;
        }

猜你喜欢

转载自www.cnblogs.com/songqingguo/p/12819468.html