java 对象序列化是什么意思(java 中的序列化是什么意思)
大家好,今天来为大家解答java 对象序列化是什么意思这个问题的一些问题点,包括java 中的序列化是什么意思也一样很多人还不知道,因此呢,今天就来为大家分析分析,现在让我们一起来看看吧!如果解决了您的问题,还望您关注下本站哦,谢谢~
java 谁能给我讲讲对象序列化呢
实质就是对对象的操作!!
可以把类对象保存到文件上,(这个就是序列化)
然后在需要的时候从文件里读出对象并恢复。(这个就是反序列化)
当进行序列化的时候:
首先JVM会先调用writeReplace方法,在这个阶段,我们可以进行张冠李戴,将需要进行序列化的对象换成我们指定的对象.
跟着JVM将调用writeObject方法,来将对象中的属性一个个进行序列化,我们可以在这个方法中控制住哪些属性需要序列化.
当反序列化的时候:
JVM会调用readObject方法,将我们刚刚在writeObject方法序列化好的属性,反序列化回来.
然后在readResolve方法中,我们也可以指定JVM返回我们特定的对象(不是刚刚序列化回来的对象).
所谓“对象序列化”:刚接触时觉得这个东西很深奥,看过以后方感其简便性,简单一句话:使用它可以象存储文本或者数字一样简单的存储对象。
具体应用:本人由于目前积累的经验还不是太多,所以想不出更好的应用场景来。比如说:程序在执行过程中突然遇到短电或者其他的故障导致程序终止,那么对象当前的工作状态也就会丢失,这对于有些应用来说是可怕的。用对象序列化就可以解决这个问题,因为它可以将对象的全部内容保存于磁盘的文件,这样对象执行状态也就被存储了,到需要时还可以将其从文件中按原样再读取出来,这样就解决了数据丢失问题!
如果您知道更多更好的应用范围可以告诉我!
怎样实现:实现就简单啦!为需要被序列化的对象实现Serializable接口,该接口没有需要实现的方法,implements Serializable只是为了标注该对象是可被序列化的,然后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject(Object obj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流,说了这么多来看一个例子吧!(在JDK1.4下调试通过)
import java.io.*;
import java.util.*;
public class ObjectFileTest
{
public static void main(String[] args)
{
Manager boss= new Manager("Carl Cracker", 80000, 1987, 12, 15);
boss.setBonus(5000);
Employee[] staff= new Employee[3];
staff[0]= boss;
staff[1]= new Employee("Harry Hacker", 50000, 1989, 10, 15);
staff[2]= new Employee("Tony Tester", 40000, 1990, 1, 15);
try
{
/**
*使用文件输出流构造一个对象输出流
*FileOutputStream文件输出流
*ObjectOutputStream对象输出流
*/
ObjectOutputStream out= new ObjectOutputStream(new
FileOutputStream("employee.dat"));
out.writeObject(staff);//将对象写入"employee.dat"中
out.close();//关闭流,请牢记
/**
*使用文件输入流构造一个对象输入流
*FileInputStream文件输入流
*ObjectInputStream对象输入流
*/
ObjectInputStream in= new ObjectInputStream(new
FileInputStream("employee.dat"));
///readObject()将对象从"employee.dat"中读出,需要类型转换
Employee[] newStaff=(Employee[])in.readObject();
in.close();
for(int i= 0; i< newStaff.length; i++)
System.out.println(newStaff[i]);
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
///implements Serializable接口为标注该对象是可序列化的
class Employee implements Serializable
{
public Employee(){}
public Employee(String n, double s, int year, int month, int day)
{
name= n;
salary= s;
GregorianCalendar calendar=
new GregorianCalendar(year, month- 1, day);
hireDay= calendar.getTime();
}
public String getName()
{
return name;
}
public double getSalary()
{
return salary;
}
public Date getHireDay()
{
return hireDay;
}
public void raiseSalary(double byPercent)
{
double raise= salary* byPercent/ 100;
salary+= raise;
}
public String toString()
{
return getClass().getName()
+"[name="+ name
+",salary="+ salary
+",hireDay="+ hireDay
+"]";
}
private String name;
private double salary;
private Date hireDay;
}
class Manager extends Employee
{
public Manager(String n, double s, int year, int month, int day)
{
super(n, s, year, month, day);
bonus= 0;
}
public double getSalary()
{
double baseSalary= super.getSalary();
return baseSalary+ bonus;
}
public void setBonus(double b)
{
bonus= b;
}
public String toString()
{
return super.toString()
+"[bonus="+ bonus
+"]";
}
private double bonus;
}
java中为什么要进行对象序列化
对象的序列化就是为了数据传输,在你的代码的里是对象格式,而在传输的时候不可能还保持这对象的样子。
当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个java对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为java对象。
1.概念
序列化:把java对象转换为字节序列的过程。
反序列化:把字节序列恢复为java对象的过程。
2.用途
对象的序列化主要有两种用途:
1)
把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;
2)
在网络上传送对象的字节序列。
java 中的序列化是什么意思
1、序列化是干什么的?
简单说就是为了保存在内存中的各种对象的状态,并且可以把保存的对象状态再读出来。虽然你可以用自己的各种方法来保存Object states,
但是Java给你提供一种应该比你自己好的保存对象状态的机制、那就是序列化。
2、什么情况下需要序列化?
a)当你想把的内存中的对象保存到一个文件或者数据库中时候。
b)当你想用套接字在网络上传送对象的时候
c)当你想通过RMI传输对象的时候(RMI->Remote Method Invocation远程方法调用)
3、当对一个对象实现序列化时,究竟发生了什么?
在没有序列化前,每个保存在堆(Heap)中的对象都有相应的状态(state),即实体变量(instance ariable)
例如:Foo myFoo=new Foo(); myFoo.setWidth(20); myFoo.setHeight(40);
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类,如果可以序列化,进行传输或者保存,也无法对他们进行重新的资源分配,而且,也是没有必要这样实现。
好了,关于java 对象序列化是什么意思和java 中的序列化是什么意思的问题到这里结束啦,希望可以解决您的问题哈!