ArcObjects编程方法(六):实现persistence
版本:ArcGIS10
关于persistence
persistence是将对象的当前状态持久的保存在文件、磁盘等存储媒介的过程。在ArcGIS中persistence被用来保存文档和模板的当前状态。通过ArcGIS的UI,可以更改地图文档的众多属性、参数,比如渲染器。当地图保存关闭后,渲染器的实例会释放。当再次打开地图,由于persistence的作用,渲染器会根据保存的状态做预设置,看到和先前一样的状态。
Structured storage, compound files, documents, and streams
地图文档的保存采用结构化存储技术,结构化存储是实现persistence的一种方式。结构化存储中,采用混合文件模型,文件既包含存储对象又包含流对象,存储对象提供结构并可以包含其他的存储对象和流对象,而流对象提供存储功能可以存储基于内部结构的任意类型数据。当流被重新打开时,新对象从流中获取状态信息进行初始化,重新创建之前对象的状态。
这样,一个单独的混合文件可以当作一个微型文件系统,可以被多个文件指针访问。结构化存储的优点有:文件渐进式读写、文件结构标准化、容量大。
ArcGIS采用结构化存储保持程序所有对象的当前状态,结构化存储只能用于非GIS数据。
混合文档结构
ArcGIS采用混合文档结构保存文档(map文档、globe文档)、模板(map模板、globe模板)。当文档被保存,所有文档的对象都保存在混合文档的流中。例如,一个map文档单击“保存”后,MxApplication创建一个流绑定到现存的.mxd文件,让后将文档信息保存到流中。
ArcMap可以保存多个项:
1、地图集——图层、符号、图形、当前范围、空间引用、渲染器等
2、纸面布局、地图框、地图周边等
3、TOC状态
4、工具栏的显示状态
5、当前数据窗口、类型、位置和内容
persistence类
当对象需要保存自己的状态,它必须将自己的成员变量写入流中。当对象中存在引用类型变量,并且引用的对象支持persistence,则要求成员对象自己保存当前状态。对象及成员对象persist过程:
ObjectStreams
在persistence过程中,多个引用可能指向同一个对象,这样对象会被多次复制,多次独立的保存在流中,ArcObjects引入ObjectStreams解决此类问题。当ArcObjects对象进行persistence时,创建stream的同时,创建ObjectStream并与stream关联。ObjectStream中保存了进行persist的对象列表。
当对象第一次被persist时,采用一般的方式进行,当对象第二次被persist时,ObjectStream确保对象不被第二次persist,而是保存该对象的引用。
实现persistence类
创建persistable类,需要实现IPersist接口和IPersistStream接口(或IPersistVariant接口)。
IPersistStream接口和IPersistVariant接口的一些功能:
1、获取对象ID IPersistStream.GetClassID IPersistVariant.ID
2、将对象保存到流 IPersistStream.Save IPersistVariant.Save
3、从流获取数据 IPersistStream.Load IPersistVariant.Load
实现IPersistVariant接口
实现IPersistVariant接口及ID属性、Save方法和Load方法
public sealed class TriangleElementClass: IPersistVariant
public UID ID { get { UID uid = new UIDClass(); uid.Value = "{" + TriangleElementClass.CLASSGUID + "}"; return uid; } } public void Save(IVariantStream Stream) { Stream.Write(m_size); Stream.Write(m_elementType); Stream.Write(m_pointGeometry); } public void Load(IVariantStream Stream) { m_size = (double)Stream.Read(); m_elementType = (string)Stream.Read(); m_pointGeometry = Stream.Read()as IPoint; }