当前位置:首页 » 存储配置 » java序列化存储

java序列化存储

发布时间: 2024-11-22 14:33:41

java中什么是序列化,怎么通俗理解序列化和反序列化

在 Java 中,序列化是指将一个 Java 对象转换为可以存储或传输的格式的过程。这个过程通常用于持久化对象,即将对象的状态保存到文件或数据库中,或在网络上传输对象。序列化的一个关键目的是使对象能够在不同平台、不同版本的 Java 虚拟机之间进行交换或存储,而不会丢失对象的任何状态信息。



反序列化是序列化的逆过程,即将序列化的数据恢复为原始对象。这个过程需要确保序列化的数据格式与反序列化时使用的类结构相匹配,以便正确地重建对象。



在实际开发中,序列化和反序列化通常用于以下场景:




  • 持久化对象:将对象的状态保存到文件或数据库,以便在后续需要时恢复对象。

  • 网络传输:在多台计算机之间传输对象,以实现分布式系统或远程过程调用(RPC)。

  • 内存缓存:将对象序列化到内存中,以便快速访问对象状态。



序列化协议对应于 TCP/IP 四层模型的应用层。在这个模型中,应用层处理用户数据的传输,而表示层负责数据的格式转换,这正是序列化和反序列化所做的事情。



常见的序列化协议包括:




  • JDK自带的序列化:实现 Serializable 接口。虽然简单易用,但效率较低且存在安全漏洞。

  • Hessian:一个轻量级、自定义描述的二进制 RPC 协议。

  • Kryo:高性能的序列化/反序列化工具,支持 Java 语言,并在 Twitter、Groupon 等公司中有广泛应用。

  • Protobuf(Protocol Buffers):由 Google 提供,性能优秀,支持多种语言,跨平台。

  • Protostuff:基于 Protobuf 的实现,提供更简易的用法。



在选择序列化协议时,应考虑以下因素:




  • 性能:序列化和反序列化的速度。

  • 体积:序列化后数据的大小。

  • 易用性:协议的使用复杂度。

  • 跨语言支持:如果需要在不同语言之间传输数据。



综上所述,Kryo 是一种性能优秀且成熟的序列化协议,适用于 Java 环境。Protobuf 和 Protostuff 为跨语言应用提供了便利。Hessian 为轻量级的二进制 RPC 协议,适合用于网络通信。在选择序列化协议时,应根据具体需求和场景选择最合适的一种。

② java 中的序列化是什么意思

简单说就是为了保存在内存中的各种对象的状态,并且可以把保存的对象状态再读出来。虽然你可以用你自己的各种各样的方法来保存Object States,但是Java给你提供一种应该比你自己好的保存对象状态的机制,那就是序列化。

(1)什么情况下需要序列化态察

a)当你想把的内存中的对象保存到一个文件中或者数据库中时候;
b)当你想用套接字在网络上传送对象的时候;
c)当你想通过RMI传输对象的时候;
(3)实现序列化(保存到一个文件)的步骤

a)Make a FileOutputStream
java 代码
FileOutputStream fs = new FileOutputStream("foo.ser");
b)Make a ObjectOutputStream

java 代码
ObjectOutputStream os = new ObjectOutputStream(fs);
c)write the object

java 代码
os.writeObject(myObject1);
os.writeObject(myObject2);
os.writeObject(myObject3);
d) close the ObjectOutputStream

java 代码
os.close();

(4)举例说明

java 代码
import java.io.*;

public class Box implements Serializable
{
private int width;
private int height;

public void setWidth(int width){
this.width = width;
}
public void setHeight(int height){
this.height = height;
}

public static void main(String[] args){
Box myBox = new Box();
myBox.setWidth(50);
myBox.setHeight(30);

try{
FileOutputStream fs = new FileOutputStream("foo.ser");
ObjectOutputStream os = new ObjectOutputStream(fs);
os.writeObject(myBox);
os.close();
}catch(Exception ex){
ex.printStackTrace();
}
}

}

总结:安全方面的原因,比如一个对象拥有private,public等field,对于一个要传输的对象,则冲比如写到文件,或者进行rmi传输 等等,在序列化进行传输的过程中,这个对象的private等域是不受保护的。资源分配方面的原因,比如socket,thread类,如果可以序列化,进行传输或者保存,也无法帆盯茄对他们进行重新的资源分 配,而且,也是没有必要这样实现。

③ java中如何实现序列化,有什么意义

首先我们要把准备要序列化类,实现 Serializabel接口
例如:我们要Person类里的name和age都序列化
import java.io.Serializable;

public class Person implements Serializable { //本类可以序列化
private String name ;
private int age ;

public Person(String name,int age){
this.name = name ;
this.age = age ;
}
public String toString(){
return "姓名:" + this.name + ",年龄" + this.age ;
}
}
然后:我们将name和age序列化(也就是把这2个对象转为二进制,统族理解为“打碎”)
package org.lxh.SerDemo;
import java.io.File;
import java.io.FileOutputStream;
import java.io.ObjectOutputStream ;
public class ObjectOutputStreamDemo { //序列化
public static void main(String[] args) throws Exception {
//序列化后生成指定文件路径
File file = new File("D:" + File.separator + "person.ser") ; ObjectOutputStream oos = null ;
//装饰流(流)
oos = new ObjectOutputStream(new FileOutputStream(file)) ;

//实例化类
Person per = new Person("张三",30) ; oos.writeObject(per) ;//把类对象序列化
oos.close() ;
}
}

热点内容
我的世界友好服务器ip地址 发布:2024-11-22 20:13:53 浏览:973
低配捷达能升级哪些配置 发布:2024-11-22 19:59:54 浏览:255
小溪流水声解压 发布:2024-11-22 19:59:03 浏览:627
datepickerandroid 发布:2024-11-22 19:54:31 浏览:655
方舟编译器与虚拟机 发布:2024-11-22 19:44:15 浏览:141
nas存储应用场景 发布:2024-11-22 19:17:07 浏览:976
美年大健康体检查询密码是什么 发布:2024-11-22 19:14:49 浏览:747
wps存储找不到了 发布:2024-11-22 19:09:21 浏览:524
苹果访问报告 发布:2024-11-22 19:06:03 浏览:658
局域网访问虚拟主机 发布:2024-11-22 19:01:05 浏览:517