首页编程java编程java中序列化注意什么(java 中的序列化是什么意思有什么好处)

java中序列化注意什么(java 中的序列化是什么意思有什么好处)

编程之家2023-10-1291次浏览

大家好,今天小编来为大家解答java中序列化注意什么这个问题,java 中的序列化是什么意思有什么好处很多人还不知道,现在让我们一起来看看吧!

java中序列化注意什么(java 中的序列化是什么意思有什么好处)

java 序列化

不知道怎么说。。。直接网上找的:1、序列化是干什么的?

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

2、什么情况下需要序列化

java中序列化注意什么(java 中的序列化是什么意思有什么好处)

a)当你想把的内存中的对象状态保存到一个文件中或者数据库中时候;

b)当你想用套接字在网络上传送对象的时候;

c)当你想通过RMI传输对象的时候;下面再给个jdk宝典里的例子吧,这样你就应该知道怎么用了:package book.io;

java中序列化注意什么(java 中的序列化是什么意思有什么好处)

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.ObjectInputStream;

import java.io.ObjectOutputStream;

import java.io.Serializable;

import java.util.Date;

/**

*序列化和反序列化对象

*/

public class SerializeObject{

//一个内部类,用于被序列化和反序列化。

//一定要实现Serializable才能够被序列化和反序列化。

static class MyClass implements Serializable{

//一般的实例变量会被序列化和反序列化

private int a,b;

//transient实例变量不会被序列化和反序列化

private transient int c;

//类变量不会被序列化和反序列化

private static int d;

public MyClass(){

}

public MyClass(int a, int b, int c, int d){

this.a= a;

this.b= b;

this.c= c;

MyClass.d= d;

}

public String toString(){

return this.a+""+ this.b+""+ this.c+""+ MyClass.d;

}

}/**

*序列化对象到文件

*/

public static void serialize(String fileName) throws Exception{

//创建一个对象输出流,将对象输出到文件

ObjectOutputStream out= new ObjectOutputStream(new FileOutputStream(fileName));

//序列化一个字符串对象到文件

out.writeObject("Today:");

//序列化当前日期对象到文件

out.writeObject(new Date());

//序列化一个MyClass对象

MyClass my1= new MyClass(5, 6, 7, 8);

out.writeObject(my1);

out.close();

}

/**

*从文件反序列化到对象

*/

public static void deserialize(String fileName) throws Exception{

//创建一个对象输入流,从文件读取对象

ObjectInputStream in= new ObjectInputStream(new FileInputStream(fileName));

//注意读对象时必须按照序列化对象时的顺序读,否则会出错

//读取字符串对象

String today=(String)(in.readObject());

System.out.println(today);

//读日期对象

Date date=(Date)(in.readObject());

System.out.println(date.toString());

//读MyClass对象,并调用它的add方法。

MyClass my1=(MyClass)(in.readObject());

System.out.println(my1.toString());

in.close();

//当恢复对象的时候,对象中的所有域被自动的恢复。如果不希望某个域被序列化,可以在它前面

//加上transient关键字,例如下面的代码:transient int noSer= 0;

//类似的,如果类中的某个域为静态,它不会被序列化。

}

/**

*@param args

*/

public static void main(String[] args) throws Exception{

String fileName="c:/temp/MyClass.ser";

SerializeObject.serialize(fileName);

//注释掉第二行,只运行下面一行,将会发现输出不同

SerializeObject.deserialize(fileName);

}

}

java序列化的优点和缺点是什么

序列化就是将一个对象的状态(各个属性量)保存起来,然后在适当的时候再获得。序列化分为两大部分:序列化和反序列化。序列化是这个过程的第一部分,将数据分解成字节流,以便存储在文件中或在网络上传输。反序列化就是打开字节流并重构对象。对象序列化不仅要将基本数据类型转换成字节表示,有时还要恢复数据。恢复数据要求有恢复数据的对象实例如果某个类能够被序列化,其子类也可以被序列化。声明为static和transient类型的成员数据不能被序列化。因为static代表类的状态, transient代表对象的临时数据。一:对象序列化可以实现分布式对象。主要应用例如:RMI要利用对象序列化运行远程主机上的服务,就像在本地机上运行对象时一样。二:java对象序列化不仅保留一个对象的数据,而且递归保存对象引用的每个对象的数据。可以将整个对象层次写入字节流中,可以保存在文件中或在网络连接上传递。利用对象序列化可以进行对象的"深复制",即复制对象本身及引用的对象本身。序列化一个对象可能得到整个对象序列。所谓优缺点就是该使用的时候就是优点,不该使用而是用就是缺点

Java中为什么要序列化什么时候用到序列化

序列化是一种用来处理对象流的机制

,所谓对象流就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题。

序列化的实现:将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法,implements Serializable只是为了标注该对象是可被序列化的,然后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject(Object obj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流;

什么时候使用序列化:

一:对象序列化可以实现分布式对象。主要应用例如:RMI要利用对象序列化运行远程主机上的服务,就像在本地机上运行对象时一样。

二:java对象序列化不仅保留一个对象的数据,而且递归保存对象引用的每个对象的数据。可以将整个对象层次写入字节流中,可以保存在文件中或在网络连接上传递。利用对象序列化可以进行对象的"深复制",即复制对象本身及引用的对象本身。序列化一个对象可能得到整个对象序列。

java 中的序列化是什么意思有什么好处

1、序列化是干什么的?

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

2、什么情况下需要序列化

a)当你想把的内存中的对象保存到一个文件中或者数据库中时候;

b)当你想用套接字在网络上传送对象的时候;

c)当你想通过RMI传输对象的时候;

3、当对一个对象实现序列化时,究竟发生了什么?

在没有序列化前,每个保存在堆(Heap)中的对象都有相应的状态(state),即实例变量(instance ariable)比如:

Foo myFoo= new Foo();

myFoo.setWidth(37);

myFoo.setHeight(70);

当通过下面的代码序列化之后,MyFoo对象中的width和Height实例变量的值(37,70)都被保存到foo.ser文件中,这样以后又可以把它从文件中读出来,重新在堆中创建原来的对象。当然保存时候不仅仅是保存对象的实例变量的值,JVM还要保存一些小量信息,比如类的类型等以便恢复原来的对象。

FileOutputStream fs= new FileOutputStream("foo.ser");

ObjectOutputStream os= new ObjectOutputStream(fs);

os.writeObject(myFoo);

4、实现序列化(保存到一个文件)的步骤

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();

5、举例说明

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();

}

}

}

6、相关注意事项

a)当一个父类实现序列化,子类自动实现序列化,不需要显式实现Serializable接口;

b)当一个对象的实例变量引用其他对象,序列化该对象时也把引用对象进行序列化;

c)并非所有的对象都可以序列化,,至于为什么不可以,有很多原因了,比如:

1.安全方面的原因,比如一个对象拥有private,public等field,对于一个要传输的对象,比如写到文件,或者进行rmi传输等等,在序列化进行传输的过程中,这个对象的private等域是不受保护的。

2.资源分配方面的原因,比如socket,thread类,如果可以序列化,进行传输或者保存,也无法对他们进行重新的资源分配,而且,也是没有必要这样实现。

END,本文到此结束,如果可以帮助到大家,还望关注本站哦!

java有什么书籍,学习Java有哪些好的书籍开发java用什么系统时间 学习java一般需要多长时间