什么是Java序列化,怎么实现java序列化

已举报 回答 关注

什么是Java序列化,怎么实现java序列化

  • 回答数

    8

  • 浏览数

    801

8个回答 默认排序
  • 默认排序
  • 按时间排序

已采纳
序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题。
序列化的实现:将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法,implements Serializable只是为了标注该对象是可被序列化的,然后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject(Object obj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流。
取消 评论
序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题。
序列化的实现:将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法,implements Serializable只是为了标注该对象是可被序列化的,然后使用一个输出流(如:FileOutputStream)来构造一个 ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject(Object obj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流。

简单来说 序列化就是把Java对象储存在某一地方(硬盘、网络),以便于传输
取消 评论
Object serialization 允许你将实现了Serializable接口的对象转换为字节序列,这些字节序列可以被完全存储以备以后重新生成原来的对象。

举个例子:
网络传输的时候,可以传字符串,亦可以传对象object,例如socket,传字符串的时候接收方很容易解析出来,但是,传一个对象的时候,对方读完字节流后,不知道你传的什么对象,所以没办法给转成原来的对象并解析对象的属性,这时候就要用到序列化和反序列化。
类实现序列化接口,socket发送这个对象的字节流,接收方到流后就可以将流反序列化成对象,然后使用对象的方法和属性。

--这里只讲了一个网络传输方面的应用,其实还有很多作用的,可以自己研究下
取消 评论
简单地说 就是把对象放在硬盘上
取消 评论
你好:
Android序列化对象主要有两种方法,实现Serializable接口、或者实现Parcelable接口。实现Serializable接口是Java SE本身就支持的,而Parcelable是Android特有的功能,效率比实现Serializable接口高,而且还可以用在IPC中。实现Serializable接口非常简单,声明一下就可以了,而实现Parcelable接口稍微复杂一些,但效率更高,推荐用这种方法提高性能。下面就介绍一下实现Parcelable接口的方法
通过实现Parcelable接口序列化对象的步骤:
1、声明实现接口Parcelable
2、实现Parcelable的方法writeToParcel,将你的对象序列化为一个Parcel对象
3、实例化静态内部对象CREATOR实现接口Parcelable.Creator:
Java代码
public static final Parcelable.Creator<T> CREATOR

其中public static final一个都不能少,内部对象CREATOR的名称也不能改变,必须全部大写。
4、完成CREATOR的代码,实现方法createFromParcel,将Parcel对象反序列化为你的对象

简而言之:通过writeToParcel将你的对象映射成Parcel对象,再通过createFromParcel将Parcel对象映射成你的对象。也可以将Parcel看成是一个流,通过writeToParcel把对象写到流里面,在通过createFromParcel从流里读取对象,只不过这个过程需要你来实现,因此写的顺序和读的顺序必须一致。

Parcel对象可以通过以下方法写入或读取byte, double, float, int, long, String这6种类型变量。
取消 评论
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类,如果可以序列化,进行传输或者保存,也无法对他们进行重新的资源分 配,而且,也是没有必要这样实现。
取消 评论
import java.util.LinkedList;public class ReplaceNumber{ public static void main ( String[] args ) { LinkedList<String> result = new LinkedList<String> (); char r = '0', g = '0', b = '0'; String rgb = "" + r + g + b; while (!"ZZZ".equals (rgb)) { if (b < ':' || ( b >= 'A' - 1 && b <= 'Z' )) { b++; } if (':' == b || 'Z' + 1 == b) { if (g < ':') { g++; b = '9'; } if (g < 'Z' + 1 && g > ':') { g++; b = 'Z'; } } if (':' == g || 'Z' + 1 == g) { if (r < '9') { r++; g = '9'; } if (r < 'Z' + 1 && r > ':') { r++; g = 'Z'; } } rgb = "" + r + g + b; if ("999".equals (rgb)) { r = 'A'; g = '0'; b = '0'; } if ("A99".equals (rgb)) { r = 'A'; g = 'A'; b = '0'; } if ("AA9".equals (rgb)) { r = 'A'; g = 'A'; b = 'A' - 1; } result.add (rgb); } System.out.println ("唯一序列号:\n" + result.toString ().replaceAll ("[\\[\\]]", "").replaceAll ("\\, ", "\n")); }}
取消 评论
在Android开发的过程中,针对对象的序列化推荐使用Parcelable,而不是Seralizable,因为Parceable的效率比较高。
这样,针对Android中大量的对象,手写实现Parcelable的代价,就比较高了。楼主github上发现一个针对Intelij和AndroidStudio的Parcelable的插件,只需集成,然后直接快捷键,实现Parcelable的接口,这样不是很爽么?。。。

1. Parcelable插件地址:https://github.com/mcharmas/android-parcelable-intellij-plugin
2.下载地址: https://github.com/mcharmas/android-parcelable-intellij-plugin/releases/tag/0.6.1
3. 按照文档说明,在IDE的Plugins中导入对应插件的Jar包,重启,就集成好了。
4. 快捷键的问题,楼主在集成后,发现对应文档所说的 ALT + Insert 不起作用,这样就需要重新设定一下了。进入IDE中keymaps中,搜索Parcelable,设定快捷键,楼主设定Ctrl+cmd+P . 在对应的Model类中,敲一下快捷键,一切Ok。

PS: 楼主发现这个插件,针对List的数据,支持的不是很完美,有两个问题:
1)List<String>类型的数据: 在使用Parcelable读取数据的时候,可以直接调用Parcel的readStringList(Params) 来进行读取,其中的Params,是指你需要指定一个新的,初始化之后List<String> 的数据,
2)List<Object>类型的数据:Object是指你自定义的数据,你可以先对Object实现Parcelable接口,这样它会针对这种生成readTypedList的方法,但你在使用这个方法时,需要对List数据进行初始化,如下所示:
if(nodes == null)
nodes = new ArrayList<PoiVO>();
in.readTypedList(nodes, PoiVO.CREATOR);

3) List<List<Object>>类型的数据: 使用下面的代码就可以了:
this.route = new ArrayList<List<PoiVO>>();
in.readList(this.route, null);

原网址:http://www.cnblogs.com/thirller/p/4385621.html
取消 评论
ZOL问答 > 什么是Java序列化,怎么实现java序列化

举报

感谢您为社区的和谐贡献力量请选择举报类型

举报成功

经过核实后将会做出处理
感谢您为社区和谐做出贡献

提示

确定要取消此次报名,退出该活动?