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过程:

001

ObjectStreams

在persistence过程中,多个引用可能指向同一个对象,这样对象会被多次复制,多次独立的保存在流中,ArcObjects引入ObjectStreams解决此类问题。当ArcObjects对象进行persistence时,创建stream的同时,创建ObjectStream并与stream关联。ObjectStream中保存了进行persist的对象列表。

当对象第一次被persist时,采用一般的方式进行,当对象第二次被persist时,ObjectStream确保对象不被第二次persist,而是保存该对象的引用。

002

实现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;
}
posted @ 2011-09-26 11:16  xmwang  阅读(594)  评论(0编辑  收藏  举报