【译】Java中的对象序列化
前言
好久没翻译simple java了,睡前来一篇。
译文链接:
http://www.programcreek.com/2014/01/java-serialization/
什么是对象序列化
在Java中,对象序列化指的是将对象用字节序列的形式表示,这些字节序列包含了对象的数据和信息,一个序列化后的对象可以被写到数据库或文件中,并且支持从数据库或文件中反序列化,从而在内存中重建对象;
为什么需要序列化
序列化经常被用于对象的网络传输或本地存储。网络基础设施和硬盘只能识别位和字节信息,而不能识别Java对象。通过序列化能将Java对象转成字节形式,从而在网络上传输或存储在硬盘。
那么为什么我们需要存储或传输对象呢?根据我的编程经验,有如下原因需要将对象序列化(以下原因,我表示没使用过。。。):
- 一个对象的创建依赖很多上下文环境,一旦被创建,它的方法和属性会被很多其它组件所使用;
- 一个包含了很多属性的对象创建后,我们并不清楚如何使用这些属性,所以将它们存储到数据库用于后续的数据分析;
顺便也说下,根据我(真正的我)的编程经验,序列化使用情况如下:
- 网络上的对象传输
- 使用一些缓存框架的时候,比如ehcache,将对象缓存到硬盘的时候,需要序列化,还有hibernate也会用到;
- RMI(远程方法调用)
Java序列化例子
以下代码展示了如何让一个类可序列化,对象的序列化以及反序列化;
对象:
package serialization; import java.io.Serializable; public class Dog implements Serializable {
private static final long serialVersionUID = -5742822984616863149L;
private String name; private String color;
private transient int weight; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getColor() {
return color;
} public void setColor(String color) {
this.color = color;
} public int getWeight() {
return weight;
} public void setWeight(int weight) {
this.weight = weight;
} public void introduce() {
System.out.println("I have a " + color + " " + name + ".");
}
}
main方法
package serialization; import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream; public class SerializeDemo {
public static void main(String[] args) {
// create an object
Dog e = new Dog();
e.setName("bulldog");
e.setColor("white");
e.setWeight(5);
// serialize
try {
FileOutputStream fileOut = new FileOutputStream("./dog.ser");
ObjectOutputStream out = new ObjectOutputStream(fileOut);
out.writeObject(e);
out.close();
fileOut.close();
System.out.printf("Serialized dog is saved in ./dog.ser");
} catch (IOException i) {
i.printStackTrace();
}
e = null;
// Deserialize
try {
FileInputStream fileIn = new FileInputStream("./dog.ser");
ObjectInputStream in = new ObjectInputStream(fileIn);
e = (Dog) in.readObject();
in.close();
fileIn.close();
} catch (IOException i) {
i.printStackTrace();
return;
} catch (ClassNotFoundException c) {
System.out.println("Dog class not found");
c.printStackTrace();
return;
}
System.out.println("\nDeserialized Dog ...");
System.out.println("Name: " + e.getName());
System.out.println("Color: " + e.getColor());
System.out.println("Weight: " + e.getWeight());
e.introduce();
}
}
结果打印:
Serialized dog is saved in ./dog.ser
Deserialized Dog ...
Name: bulldog
Color: white
Weight: 0
I have a white bulldog.
【译】Java中的对象序列化的更多相关文章
- JAVA中JavaBean对象之间属性拷贝的方法
JAVA中JavaBean对象之间的拷贝通常是用get/set方法,但如果你有两个属性相同的JavaBean或有大部分属性相同的JavaBean,对于这种情况,可以采用以下几个简便方法处理. 下面对这 ...
- Java IO(Properties/对象序列化/打印流/commons-io)
Java IO(Properties/对象序列化/打印流/commons-io) Properties Properties 类表示了一个持久的属性集.Properties 可保存在流中或从流中加载. ...
- 【学习笔记】Java中生成对象的5中方法
概述:本文介绍以下java五种创建对象的方式: 1.用new语句创建对象,这是最常用的创建对象的方式. 2.使用Class类的newInstance方法 3.运用反射手段,调用java.lang.re ...
- 浅谈Java中的对象和引用
浅谈Java中的对象和对象引用 在Java中,有一组名词经常一起出现,它们就是“对象和对象引用”,很多朋友在初学Java的时候可能经常会混淆这2个概念,觉得它们是一回事,事实上则不然.今天我们就来一起 ...
- java中直接打印对象
java中直接打印对象,会调用对象.toString()方法.如果没有重写toString()方法会输出"类名+@+hasCode"值,hasCode是一个十六进制数 //没有重写 ...
- 如何使用java中的对象
使用java中的对象,分2步: 1.创建一个对象: 2.使用对象的属性和方法. 见下面的示例代码: package com.imooc; //1.定义一个类 public class Telphone ...
- Java中String对象的不可变性
首先看一个程序 package reverse; public class Reverse { public static void main(String[] args) { String c1=n ...
- JAVA中JavaBean对象之间拷贝的方法
JAVA中JavaBean对象之间的拷贝通常是用get/set方法,但如果你有两个属性相同的JavaBean或有大部分属性相同的JavaBean,有个更简便的方法,他们之间的拷贝可以通过copyPro ...
- Java中的对象池技术
java中的对象池技术,是为了方便快捷地创建某些对象而出现的,当需要一个对象时,就可以从池中取一个出来(如果池中没有则创建一个),则在需要重复重复创建相等变量时节省了很多时间.对象池其实也就是一个内存 ...
随机推荐
- [Android] 环境配置之正式版Android Studio 1.0
昨天看见 Android Studio 1.0 正式版本发布了:心里挺高兴的. 算是忠实用户了吧,从去年开发者大会一开始出现 AS 后就开始使用了:也是从那时开始就基本没有用过 Eclipse 了:一 ...
- Nancy 引用源码与NuGet安装差异
使用NuGet安装Nancy和直接引用源码项目存在一些差异,如序列化,授权验证问题. 如果引用源码的话,自定义JsonSerializer,如下: 注意,需要使用NuGet安装Newtonsoft.J ...
- 不可或缺 Windows Native (23) - C++: 虚函数
[源码下载] 不可或缺 Windows Native (23) - C++: 虚函数 作者:webabcd 介绍不可或缺 Windows Native 之 C++ 虚函数 示例1.基类CppHuman ...
- line-height 属性
p.small {line-height:90%} p.big {line-height:200%} 该属性会影响行框的布局.在应用到一个块级元素时,它定义了该元素中基线之间的最小距离而不是最 ...
- GitHub上新建或删除仓库Repository
一:新建仓库 在首页的New Repository,点击进入页面,输入和项目同名的仓库名就可以了.
- Android开发中Eclispe相关问题及相应解决(持续更新)
1.Eclipse项目中的Android Private Libraries没有自动生成. 一般而言,在Android开发中,项目中引用到的jar包会放到项目目录中的libs中,引入库会放到Andro ...
- Server Tomcat v7.0 Server at localhost was unable to&nbs 报错问题解决
在eclipse启动tomcat时遇到超时45秒的问题: Server Tomcat v7.0 Server at localhost was unable to start within 45 se ...
- 控制器层(Controllers)
本章译者:@freewind 业务逻辑代码通常位于模型(model)层.客户端(比如浏览器)无法直接调用其中的代码,所以模型对象提供的功能,必须作为资源以URI方式暴露给外部. 客户端使用HTTP协议 ...
- 基于jQuery的ajax对WebApi和OData的封装
基于jQuery的ajax对WebApi和OData的封装 WebApi 的使用带来了一个显著的特点,对type有一定的要求.一般ajax的type无非就是两种,GET和POST.如果用JSONP来跨 ...
- Visual Studio Code 使用 ESLint 增强代码风格检查
前言 在团队协作开发中,为了统一代码风格,避免一些低级错误,应该设有团队成员统一遵守的编码规范.很多语言都提供了Lint工具来实现这样的功能,JavaScript也有类似的工具:ESLint.除了可以 ...