ArcEngine中只要是继承了IPersistStream接口的对象均可调用ArcEngine中的类库进行序列化和反序列化。一般我们会序列化成xml格式,作为字符串存储,需要的时候,反序列化为对象。但实际使用的时候,发现序列化出来的xml有乱码,反序列化的时候也会报错。看了下相关接口,也没找到设置文字编码的地方。
最后想着不如序列化成byte[],然后把byte[]保存成字符串存储,反序列化的时候,从字符串先转换成byte[],再进行反序列化。实际测试验证,这种方式是可行的。
具体代码如下。
/// <summary> /// 保存成bytes字符串 /// </summary> /// <param name="pPersistStream"></param> /// <returns></returns> public static string ToBytesString(IPersistStream pPersistStream) { IMemoryBlobStream myMemoryBlobStream = new MemoryBlobStreamClass(); pPersistStream.Save(myMemoryBlobStream, 0); IMemoryBlobStreamVariant myMemoryBlobStreamVariant = myMemoryBlobStream as IMemoryBlobStreamVariant; object myObject; myMemoryBlobStreamVariant.ExportToVariant(out myObject); return Convert.ToBase64String(myObject as byte[]); } /// <summary> /// 从bytes字符串中解析对象信息 /// </summary> /// <param name="pBytesString"></param> /// <param name="pPersistStream"></param> public static void FromBytesString(string pBytesString, IPersistStream pPersistStream) { byte[] myByteArray = Convert.FromBase64String(pBytesString); IMemoryBlobStream myMemoryBlobStream = new MemoryBlobStreamClass(); IMemoryBlobStreamVariant myMemoryBlobStreamVariant = myMemoryBlobStream as IMemoryBlobStreamVariant; myMemoryBlobStreamVariant.ImportFromVariant(myByteArray); pPersistStream.Load(myMemoryBlobStream); }