`
webcode
  • 浏览: 5942148 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

java与c++中的对象序列化 分析。

 
阅读更多

有时候我们在开发项目的时候,对于数据的保存 我们通常是直接将数据保存到磁盘上面 ,但是这样操作起来非常的不方便 ,尤其是在大型的项目开发中。 对象的序列化

可以将对象以数据的形式存储到文件中;反之我们也可以从文件中加载一个对象 ,也叫反序列化。

对于多个数据的操作封装在一起,写入文件,在反序列化的时候我们只需要读取这个对象就可以了 ,我么就不必关心内部数据和方法了 。因为所有数据都包含在对象中。

对象的序列化规则 不同的语言 不一样 ,java中有java的规则 ,c++中有自己的规则 。可以这样理解,他们将一个对象按某种规则转换成与机器指令对应的数据集,然后存储到文件中。反序列化的时候只需要按照规则解密,然后在内存中重构对象。

1、 java中的序列化 。

支持序列化的类必须实现 Serializable接口 ,这样他才可以被序列化 和反序列化 、。 下面是一个简单那的例子

Class A implements Serializable //定义可以序列化的类

{

public int a ;

public A(int x){this.a=a ;}

public void show()

{

System.out.println(a) ;
}
}

main方法添加如代码 :

序列化 :

A tem=new A() ;

FileOutputStream fos=new FileOutputStream("d:\\a.txt") ;

ObjectOutputStream oos=new ObjectOutputStream(fos) ;

oos.writeObject(tem) ;

反序列化:

FileInputStream fis=new FileInputStream("d:\\a.txt") ;

ObjectInputStream ois=new ObjectInputStream(fis) ;

A tem=(A)oos.readObjec()t;

2、

C++下的序列化 :

1、首先序列化的类必须从CObject派生

2、必须实现CObject的 Serialize 方法 使用CArchive::IsLoading or CArchive::IsStoring来决定是加载还是存储

3、 在类的定义部分添加DECLARE_SERIAL 宏 在实现部分定义IMPLEMENT_SERIAL 宏

4、CArchive::ReadObject and CArchive::WriteObject 来反序列化或者 序列化对象

代码如下:

类定义:

class MyObject :public CObject
{
public:
DECLARE_SERIAL(MyObject)
void Serialize(CArchive& ar);
void Show() ;
void SetValue(int a,int b) ;
int a ;
int b ;
};
IMPLEMENT_SERIAL(MyObject,CObject,5)
void MyObject::Serialize(CArchive& ar)
{
CObject::Serialize(ar);
if(ar.IsStoring())
ar<<a<<b;
else
ar>>b>>a;
}
void MyObject::Show()
{
CString str;
str.Format("%d%d",a,b) ;
MessageBox(NULL,str,"",MB_OK) ;
}
void MyObject::SetValue(int a,int b)
{
this->a=a ;
this->b=b ;
}

序列化示例:

MyObject obj ;
obj.SetValue(1,2) ;
CFile file("d:\\obj.txt",CFile::modeReadWrite|CFile::modeNoTruncate|CFile::modeCreate); //打开文件
CArchive arc(&file,CArchive::store) ; //将CArchive和 CFile类对象关联
arc.WriteObject(&obj) ; //向文件写入对象

反序列化示例:

MyObject obj ;
CFile file("d:\\obj.txt",CFile::modeRead); //加载文件
CArchive arc(&file,CArchive::load) ; //定义CArchive和CFile关联
((MyObject*)arc.ReadObject(obj.GetRuntimeClass()))->Show(); //读取序列化对象

分享到:
评论

相关推荐

    Hprose与.NET中各种序列化方式的对比

    本文主要在.NET平台上对比Hprose与.NET平台中提供的各种序列化方式的比较,序列化并不是Hprose的全部,但它是Hprose的核心部分之一,通过对序列化的比较,我们就可以对Hprose的性能有一个大概的了解了。 Hprose提供...

    MessagePack序列化实例代码

    MessagePack是一个基于二进制高效的对象序列化Library用于跨语言通信。它可以像JSON那样,在许多种语言之间交换结构对象;但是它比JSON更快速也更轻巧。 支持Python、Ruby、Java、C/C++、Javascript等众多语言。 比...

    JAVA上百实例源码以及开源项目源代码

    通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥,通常应对私钥加密后再保存、如何从...

    java开源包8

    一个Java远程调用框架,它将原生Java对象序列化压缩装入HTTP中。它是 Spring HttpInvoker的一个轻量级选择,特别适合于当你不想在客户端程序中使用Spring框架。 API访问授权的开放标准 OAuth OAuth 协议为用户资源...

    JAVA上百实例源码以及开源项目

    通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥,通常应对私钥加密后再保存、如何从...

    java联想(中文)

    12.2.8 通过序列化进行深层复制 12.2.9 使克隆具有更大的深度 12.2.10 为什么有这个奇怪的设计 12.3 克隆的控制 12.3.1 副本构建器 12.4 只读类 12.4.1 创建只读类 12.4.2 “一成不变”的弊端 12.4.3 不变字串 ...

    Java2简明教程

    全书共12章,主要包括:Java 2编程基础、面向对象编程原理、接口、包、字符串类String和StringBuffer、异常处理、输入和输出、多线程、Java小程序、GUI布局管理、对象序列化、内隐类、Adapter类和事件处理等,非常...

    Thinking in Java简体中文(全)

    12.2.8 通过序列化进行深层复制 12.2.9 使克隆具有更大的深度 12.2.10 为什么有这个奇怪的设计 12.3 克隆的控制 12.3.1 副本构建器 12.4 只读类 12.4.1 创建只读类 12.4.2 “一成不变”的弊端 12.4.3 不变字串 ...

    Java面试题超级全.zip

    整理了很久很久Java面试题,很全面,从java基础、框架、数据库、分布式、微服务等等都有。 我总结成四个阶段的面试题...如何将一个 java 对象序列化到文件里? ``` 在 java 中能够被序列化的类必须先实现 Serializable

    java开源包11

    一个Java远程调用框架,它将原生Java对象序列化压缩装入HTTP中。它是 Spring HttpInvoker的一个轻量级选择,特别适合于当你不想在客户端程序中使用Spring框架。 API访问授权的开放标准 OAuth OAuth 协议为用户资源...

    java开源包6

    一个Java远程调用框架,它将原生Java对象序列化压缩装入HTTP中。它是 Spring HttpInvoker的一个轻量级选择,特别适合于当你不想在客户端程序中使用Spring框架。 API访问授权的开放标准 OAuth OAuth 协议为用户资源...

    java开源包4

    一个Java远程调用框架,它将原生Java对象序列化压缩装入HTTP中。它是 Spring HttpInvoker的一个轻量级选择,特别适合于当你不想在客户端程序中使用Spring框架。 API访问授权的开放标准 OAuth OAuth 协议为用户资源...

    java开源包9

    一个Java远程调用框架,它将原生Java对象序列化压缩装入HTTP中。它是 Spring HttpInvoker的一个轻量级选择,特别适合于当你不想在客户端程序中使用Spring框架。 API访问授权的开放标准 OAuth OAuth 协议为用户资源...

    java开源包101

    一个Java远程调用框架,它将原生Java对象序列化压缩装入HTTP中。它是 Spring HttpInvoker的一个轻量级选择,特别适合于当你不想在客户端程序中使用Spring框架。 API访问授权的开放标准 OAuth OAuth 协议为用户资源...

    快速二进制编码是针对C ++,C#,Go,Java,JavaScript,Kotlin,Python,Ruby,Swift的超快速通用序列化解决方案-C/C++开发

    快速二进制编码(FBE)快速二进制编码允许描述任何域模型,...快速二进制编码文档快速二进制编码下载快速二进制编码规范可在此处找到与其他协议的性能比较:协议消息大小序列化时间反序列化时间Cap'n'Proto 208字节55

    java开源包5

    一个Java远程调用框架,它将原生Java对象序列化压缩装入HTTP中。它是 Spring HttpInvoker的一个轻量级选择,特别适合于当你不想在客户端程序中使用Spring框架。 API访问授权的开放标准 OAuth OAuth 协议为用户资源...

    Thinking in Java 中文第四版+习题答案

    12.2.8 通过序列化进行深层复制 12.2.9 使克隆具有更大的深度 12.2.10 为什么有这个奇怪的设计 12.3 克隆的控制 12.3.1 副本构建器 12.4 只读类 12.4.1 创建只读类 12.4.2 “一成不变”的弊端 12.4.3 不变字串 ...

    java开源包10

    一个Java远程调用框架,它将原生Java对象序列化压缩装入HTTP中。它是 Spring HttpInvoker的一个轻量级选择,特别适合于当你不想在客户端程序中使用Spring框架。 API访问授权的开放标准 OAuth OAuth 协议为用户资源...

    java 编程入门思考

    12.2.8 通过序列化进行深层复制 12.2.9 使克隆具有更大的深度 12.2.10 为什么有这个奇怪的设计 12.3 克隆的控制 12.3.1 副本构建器 12.4 只读类 12.4.1 创建只读类 12.4.2 “一成不变”的弊端 12.4.3 不变字串 ...

    Java初学者入门教学

    12.2.8 通过序列化进行深层复制 12.2.9 使克隆具有更大的深度 12.2.10 为什么有这个奇怪的设计 12.3 克隆的控制 12.3.1 副本构建器 12.4 只读类 12.4.1 创建只读类 12.4.2 “一成不变”的弊端 12.4.3 不变字串 ...

Global site tag (gtag.js) - Google Analytics