酱坛子

专注C++技术 在这里写下自己的学习心得 感悟 和大家讨论 共同进步(欢迎批评!!!)

  C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  65 Posts :: 16 Stories :: 236 Comments :: 0 Trackbacks

公告

王一伟 湖南商学院毕业 电子信息工程专业

常用链接

留言簿(19)

我参与的团队

搜索

  •  

积分与排名

  • 积分 - 353004
  • 排名 - 53

最新随笔

最新评论

阅读排行榜

评论排行榜

最近公司让我写个小模块,完成序列化的底层设计

现在XMLFormatter已经完成,要继续完成BinaryFormatter

在网上搜索了一下,到处都是关于framework里面Formatter的使用的说明,没有原理方面的介绍,实在不知道该如何下手

基本就是要实现将类转换成二进制信息序列化进文件里面
   
String str;

BinaryFormatter xml;

File file;
xml.Serialize(&file,&str);

呵呵 还有反序列化 省略了


 

posted on 2007-03-22 11:58 @王一伟 阅读(1638) 评论(14)  编辑 收藏 引用

Feedback

# re: 请达人提示一下 2007-03-22 12:23 mu
序列化是将对象状态转换成可保持或传输的格式。
反序列化是将流转换为对象。
序列化和反序列化的作用是:使数据能够被轻松的存储和传输。
实质上序列化机制是将类的值转化为一个一般的(即连续的)字节流,然后就可以将该流写到磁盘文件或任何其他流化目标上。而要想实际的写出这个流,就要使用那些实现了IFormatter接口的类里的Serialize和Deserialize方法。
在.net框架里提供了这样两个类:
BinaryFormatter:使用二进制格式化程序进行序列化。
SoapFormatter:以xml格式化
XmlSerializer类
DotNet中的序列化方法有三种:XML 序列化、SOAP 序列化和二进制序列化。若是序列化到文件的话,前两者生成的是 XML 文件,二进制序列化生成二进制文件。   回复  更多评论
  

# re: 请达人提示一下 2007-03-22 12:25 mu
我这有一个转换二进制的例子,要引用的命名空间有:System.Runtime.Serialization.Formatters.Binary;System.IO

static void Main(string[] args)
{
CreateSerializable();
ReadSerizlizable();
}

/// <summary>
/// 二进制序列化
/// </summary>
public static void CreateSerializable()
{
MyObject obj = new MyObject();
obj.n1 = 1;
obj.n2 = 24;
obj.str = "haha";
System.Runtime.Serialization.IFormatter formatter = new BinaryFormatter();
Stream stream = new FileStream("MyFile.bin",FileMode.Create,FileAccess.Write,FileShare.None);
formatter.Serialize(stream,obj);
stream.Close();
}

/// <summary>
/// 二进制反序列化
/// </summary>
public static void ReadSerizlizable()
{
System.Runtime.Serialization.IFormatter formatter = new BinaryFormatter();
Stream stream = new FileStream("MyFile.bin",FileMode.Open,FileAccess.Read,FileShare.Read);
MyObject obj = (MyObject)formatter.Deserialize(stream);
stream.Close();

Console.Write(obj.n1.ToString() + "\n");
Console.Write(obj.n2.ToString() + "\n");
Console.Write(obj.str + "\n");
Console.Read();
}

[Serializable]
public class MyObject
{
public int n1 = 0;
public int n2 = 0;
public string str = null;
}
  回复  更多评论
  

# re: 请达人提示一下 2007-03-22 13:16 王一伟
呵呵 我是想实现BinaryFormatter这个类  回复  更多评论
  

# re: 请达人提示一下 2007-03-22 13:28 王一伟
Binary Format到xml文件里面有没有意义?  回复  更多评论
  

# re: 请达人提示一下 2007-03-22 14:27 Corner Zhang
要看是什么要求
1 需要在XML的可读格式与Binary格式间转化吗?
是的话BinaryFormatter就是: 先把内存中对象的布局->XML可理解的格式,然后像大多数编解码器的原理那样,做一次XML->Binary的转化,同时存储到disc上,成为文件
2 如果第一个问题地回答是否,问题就显得比较简单些,直接完成对象布局->Binary的转化,如果心理对C++的对象不够了解,先看看Lippman的<<Inside The C++ Object Model>>

  回复  更多评论
  

# re: 请达人提示一下 2007-03-22 14:55 王一伟
我不需要XML的可读格式与Binary格式间转化,那样无意于提高效率

我现在在研读<<Inside The C++ Object Model>> 的相关章节

多谢Corner Zhang 示,很清楚
  回复  更多评论
  

# re: 请达人提示一下 2007-03-23 13:16 Dyj
如果使用C++做这个比较难,不必Java和.NET,因为C++的类缺少元数据,无法描述自身的结构.不知楼主的平台是什么?  回复  更多评论
  

# re: 请达人提示一下 2007-03-23 14:18 王一伟
C++的 呵呵  回复  更多评论
  

# re: 请达人提示一下[未登录] 2007-03-24 00:09 eXile
我前一向刚好做过类似的东西, 用C++实现, 只要不要求动态生成, 其实还是很简单的, 只要实现了基本的数值类型, 字符串就可以, 其它对象都是它们的组合, 另外还要考虑以下方面:(1)支持标准容器 (2)字节序的问题

可以参考 MFC 中CArchive 与 boost 序列化库的实现. 另外, boost 提供了xml, text, binary 多种形式, 你也可以直接使用它们, 不一定非要自己做一个  回复  更多评论
  

# re: 请达人提示一下 2007-03-25 23:04 lunny xiao
直接用Boost.Serialization,未来的标准,一般没必要自己做。  回复  更多评论
  

# re: 请达人提示一下 2007-03-29 16:22 王一伟
现在我可以描述自己的结构:),公司的框架仿.net提供了这些支持  回复  更多评论
  

# re: 请达人提示一下 2007-03-30 13:48 think
可以用Boost.Serialization,不过有很多问题,比如带虚函数的类.个人觉得那个库做基于对象还行,做面向对象就不行了.

相比,可以看看TAO,用于网络上的序列化,不过很复杂  回复  更多评论
  

# re: 请达人提示一下 2007-04-11 09:49 @王一伟
HOHO 已经完成带基本数据类型 和string的类序列化  回复  更多评论
  

# re: 请达人提示一下 2007-04-11 09:50 @王一伟
转过来支持下array,pointer,map等  回复  更多评论
  


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理