天天看點

有關AE對象的序列化(C#)

AE中提供了IPersistStream接口進行AE對象的序列化,所有繼承了IPersistStream接口的AE對象都可以使用IPersistStream進行對象的序列化。它的使用方法如下:

void SerializeArcGisObject(object gisObj)

{

   //轉換成IPersistStream對象

ESRI.ArcGIS.esriSystem.IPersistStream ps = gisObj as ESRI.ArcGIS.esriSystem.IPersistStream;

//如果是繼承了IPersistStream接口,則序列化

if (ps != null)

{

     //定義一種流對象;這裡使用了MemoryBlobStreamClass

      ESRI.ArcGIS.esriSystem.MemoryBlobStreamClass mbsc = new ESRI.ArcGIS.esriSystem.MemoryBlobStreamClass();

      //把對象儲存到流中

ps.Save(mbsc, 0);

//儲存成檔案

       mbsc.SaveToFile(tempFileName);

    }

}

使用這個序列化時需要注意,有時在ps.Save(mbsc, 0)時會提示無限循環的錯誤,這時需要檢查序列化對象是否存在嵌套的成員(類A包含類B成員,而B有包含了A的對象),例如AE的比例尺元素的對象,在該對象中是存有目前的地圖對象,而地圖對象又有比例尺元素的這個對象,是以一般會提示錯誤。這時在序列化對象時,需要把序列化對象的這種成員的值去掉,再進行序列化。例如上面的比例尺對象,把比例尺的Map成員賦成null,再進行序列化(注意:一般要先拷貝對象後,再把成員賦成null值,否則可能出現記憶體通路錯誤,使用IObjectCopy進行拷貝)。

上面說的是序列化,那麼在序列化完成後,反序列化也就必不可少了。

object DeserializeArcGisObject(string filename,Guid guid)

{

//定義一種流對象;這裡使用了MemoryBlobStreamClass

//使用流讀取檔案

                ESRI.ArcGIS.esriSystem.MemoryBlobStreamClass mbsc = new ESRI.ArcGIS.esriSystem.MemoryBlobStreamClass();

//使用流讀取檔案

mbsc.LoadFromFile(filename);

//執行個體化對象,這裡需要知道這個檔案存的是那個對象,可以

//這裡使用COM的Guid來标示(起始可以自己定義一種檔案,檔案頭存Guid)

//使用COM的Guid擷取Com類型

Type comType = Type.GetTypeFromCLSID(guid, false);

//通過Type執行個體化對象

            ESRI.ArcGIS.esriSystem.IPersistStream ips = (ESRI.ArcGIS.esriSystem.IPersistStream)Activator.CreateInstance(comType);

  ips.Load(objStream);

   return ips;

}

使用這個方式反序列化時,如果想把反序列的對象轉換成實體類(Guid一樣的)的對象,是無法進行轉換的,隻能轉換成對應的接口。如果想轉換的話,可以使用記憶體拷貝的方式進行轉換。有關記憶體拷貝可以參考IObjectCopy的方法。