Scene场景的保存!

原创文章,转载请注明出处!

这里学习了一下IStream和IPersistStream接口。

FileStream、ObjectStream和XmlStream类都继承了IStream接口。IPersist-->IPersistStream和IStream都是COM的接口,微软的接口。

FileStream、ObjectStream和XmlStream类则是Esri的类对象,new 对象的时候,类名包含class这几个字符FileStreamClass、ObjectStreamClass和XmlStreamClass,明显是RCW封装后的类。

串行化(serialization)是指将一个对象的当前状态转换成字节流(a stream of bytes)的过程,而反串行化(deserialization)则指串行化过程的逆过程,将字节流转换成一个对象。.Net目前通过Iserializeable接口实现序列化。这也就是我用C#开发的时候想序列化包含COM成员的类是产生的问题。难道必须转换?

情况描述为:1. 自己定义的一个类,类的成员有.net的值类型和对象,还包括COM对象,这时候应该如何保持我的这个类?

2.在保存COM对象的时候,比如下面对Scene的序列化,怎样同时保存同一窗体中其他的成员变量(.net变量或对象)?

View Code
 1 private void 保存场景ToolStripMenuItem_Click(object sender, EventArgs e)
2 {
3 SaveFileDialog pSaveDlg = new SaveFileDialog();
4 pSaveDlg.Filter = "3D场景(*.sce)|*.sce";
5
6 pSaveDlg.Title = "生成3D场景";
7 if (pSaveDlg.ShowDialog() == DialogResult.OK)
8 {
9 string exportname = pSaveDlg.FileName;
10 IMemoryBlobStream pMemoryBlobStream = new MemoryBlobStreamClass();
11 IObjectStream pObjectStream = new ObjectStreamClass();
12 pObjectStream.Stream = pMemoryBlobStream;
13 IPersistStream pPersistStream = (IPersistStream)m_scene;
14 pPersistStream.Save((IStream)pObjectStream, 0);
15 pMemoryBlobStream.SaveToFile(exportname);
16 MessageBox.Show("场景保存成功!");
17 }
18 }
19
20 private void 打开场景ToolStripMenuItem_Click(object sender, EventArgs e)
21 {
22 OpenFileDialog pDlg = new OpenFileDialog();
23 pDlg.Filter = "3D场景(*.sce)|*.sce";
24 pDlg.Multiselect = false;
25 pDlg.Title = "3D场景";
26 if (pDlg.ShowDialog() == DialogResult.OK)
27 {
28 string fileName = pDlg.FileName;
29 string path = System.IO.Path.GetDirectoryName(fileName);
30 string name = System.IO.Path.GetFileNameWithoutExtension(fileName);
31 IMemoryBlobStream pMemoryBlobStream = new MemoryBlobStreamClass();
32 pMemoryBlobStream.LoadFromFile(fileName);
33 IObjectStream pObjectStream = new ObjectStreamClass();
34 pObjectStream.Stream = pMemoryBlobStream;
35 IPersistStream pPersistStream = (IPersistStream)m_scene;
36 pPersistStream.Load((IStream)pObjectStream);
37 axSceneControl1.SceneGraph.Scene = m_scene;
38 axSceneControl1.SceneGraph.RefreshViewers();
39 }
40 }

参考文献:

http://www.cnblogs.com/myparamita/archive/2009/01/21/1379325.html

http://blog.csdn.net/puttytree/article/details/5376423

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值