Java对象的序列化与反序列化:默认格式及JSON格式(使用jackson)
我的技术博客经常被流氓网站恶意爬取转载。请移步原文:http://www.cnblogs.com/hamhog/p/3558663.html,享受整齐的排版、有效的链接、正确的代码缩进、更好的阅读体验。
【默认格式】
public class MyClass implements Serializable{
...}
序列化:
ObjectOutputStream output = new ObjectOutputStream(new FileOutputStream(outputPath));
output.writeObject(myObject);
反序列化:
ObjectInputStream input = new ObjectInputStream(new FileInputStream(inputPath));
return (MyClass)input.readObject();
【JSON格式】
使用jackson包。jackson是一个效率非常高的Java JSON包。文档和下载见官网。
序列化:
ObjectMapper mapper = new ObjectMapper();
mapper.writeValue(new File(outputPath), myObject);
反序列化:
return mapper.readValue(new File(outputPath), MyClass.class);
【完整测试代码】
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.ArrayList; import com.fasterxml.jackson.core.JsonGenerationException;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper; public class Zoo implements Serializable { private static final long serialVersionUID = 1L;
private static ObjectMapper mapper = new ObjectMapper(); public static int maxAnimalCount;
public ArrayList<String> animals; public Zoo() {
animals = new ArrayList<String>();
} public static void setMax(int max){
maxAnimalCount = max;
} /**
* Add an animal to animals Array.
* @param animalName
*/
public void addAnimal(String animalName){
if (animals.size() < maxAnimalCount)
animals.add(animalName);
} @Override
public String toString(){
return "Zoo: \n animals: " + animals.toString() +
"\n maxAnimalCount: " + maxAnimalCount + "\n";
} /**
* Output standard serialization to file at logPath.
* @param logPath
*/
public void serializeToLog(String logPath) {
ObjectOutputStream output = null;
try
{
output = new ObjectOutputStream(
new FileOutputStream(logPath));
output.writeObject(this);
} catch(Exception e) {
e.printStackTrace();
} finally {
try {
output.close();
} catch (IOException e) {
e.printStackTrace();
}
}
} /**
* Output JSON serialization(using jackson) to file at logPath.
* @param logPath
*/
public void serializeJSONToLog(String logPath){ try {
mapper.writeValue(new File(logPath), this);
} catch (JsonGenerationException e) {
e.printStackTrace();
} catch (JsonMappingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
} /**
* Standard deserialize a Zoo instance from file at logPath.
* @param logPath
* @return deserialized zoo instance
*/
public static Zoo deserializeFromLog(String logPath) {
ObjectInputStream input = null;
try
{
input =new ObjectInputStream(
new FileInputStream(logPath));
return (Zoo)input.readObject();
} catch(Exception e) {
e.printStackTrace();
} finally {
try {
input.close();
} catch (IOException e) {
e.printStackTrace();
}
} return null;
} /**
* JSON deserialize a Zoo instance from file at logPath.
* @param logPath
* @return JSON deserialized zoo instance
*/
public static Zoo deserializeJSONFromLog(String logPath){
try {
return mapper.readValue(new File(logPath), Zoo.class);
} catch (JsonParseException e) {
e.printStackTrace();
} catch (JsonMappingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} return null;
}
} class ZooSerializeTest {
public static void main(String[] args) {
Zoo zoo1 = new Zoo();
Zoo.setMax(100);
zoo1.addAnimal("hamster");
zoo1.addAnimal("sheep"); zoo1.serializeToLog("zoo1.log"); Zoo zoo2 = new Zoo();
Zoo.setMax(200);
zoo2.addAnimal("tiger"); zoo2.serializeToLog("zoo2.log"); Zoo.setMax(300); //Deserialization
zoo1 = Zoo.deserializeFromLog("zoo1.log");
zoo2 = Zoo.deserializeFromLog("zoo2.log"); System.out.println("zoo1: \n" + zoo1);
System.out.println("zoo2: \n" + zoo2); //Serialize to JSON
zoo1.serializeJSONToLog("zoo1.json");
zoo1 = Zoo.deserializeJSONFromLog("zoo1.json"); System.out.println("zoo1 from json: \n" + zoo1);
}
}
注意到默认的serialize会序列化private的属性,不会序列化静态属性;而jackson不会序列化非public的属性和静态属性。
Java对象的序列化与反序列化:默认格式及JSON格式(使用jackson)的更多相关文章
- Java对象的序列化与反序列化
序列化与反序列化 序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程.一般将一个对象存储至一个储存媒介,例如档案或是记亿体缓冲等.在网络传输过程中,可以是字节或是 ...
- Java对象的序列化和反序列化[转]
Java基础学习总结--Java对象的序列化和反序列化 一.序列化和反序列化的概念 把对象转换为字节序列的过程称为对象的序列化.把字节序列恢复为对象的过程称为对象的反序列化. 对象的序列化主要有两种用 ...
- Java对象的序列化与反序列化-Json篇
说到Java对象的序列化与反序列化,我们首先想到的应该是Java的Serializable接口,这玩意在两个系统之间的DTO对象里面可能会用到,用于系统之间的数据传输.或者在RPC(远程方法调用)时可 ...
- 一文带你全面了解java对象的序列化和反序列化
摘要:这篇文章主要给大家介绍了关于java中对象的序列化与反序列化的相关内容,文中通过详细示例代码介绍,希望能对大家有所帮助. 本文分享自华为云社区<java中什么是序列化和反序列化?>, ...
- Java基础学习总结——Java对象的序列化和反序列化
一.序列化和反序列化的概念 把对象转换为字节序列的过程称为对象的序列化. 把字节序列恢复为对象的过程称为对象的反序列化. 对象的序列化主要有两种用途: 1) 把对象的字节序列永久地保存到硬盘上,通常存 ...
- java对象的序列化与反序列化使用
1.Java序列化与反序列化 Java序列化是指把Java对象转换为字节序列的过程:而Java反序列化是指把字节序列恢复为Java对象的过程. 2.为什么需要序列化与反序列化 我们知道,当两个进程进 ...
- Java对象的序列化和反序列化实践
2013-12-20 14:58 对象序列化的目标是将对象保存在磁盘中,或者允许在网络中直接传输对象.对象序列化机制允许把内存中的Java对象转换成平台无关的二进制流,从而允许把这种二进制流持久的保存 ...
- 深入理解Java对象的序列化与反序列化的应用
当两个进程在进行远程通信时,彼此可以发送各种类型的数据.无论是何种类型的数据,都会以二进制序列的形式在网络上传送.发送方需要把这个Java对象转换为字节序列,才能在网络上传送:接收方则需要把字节序列再 ...
- java 对象的序列化与反序列化
一.序列化和反序列化的概念 把对象转换为字节序列的过程称为对象的序列化. 把字节序列恢复为对象的过程称为对象的反序列化. 对象的序列化主要有两种用途: 1) 把对象的字节序列永久地保存到硬盘上,通常存 ...
随机推荐
- CentOS安装卸载memcache及JAVA示例
原文地址:http://www.cnblogs.com/zhongshengzhen/ 先安装libevent,memcached依赖libevent的lib [root@VM_64_81_c ...
- 【STL源码学习】细品vector
第一节:vector简介 vector是一种典型的类模板,使用的时候必须进行实例化. vector的数据存储在数组上,支持随机访问迭代器,支持下标操作[]和at操作,支持手动扩容和自动容量增长. ve ...
- Windows 环境下基于 Redis 的 Celery 任务调度模块的实现
搭建环境: Windows-x64 10 Celery 3.1.23 Celery-with-redis 3.0 Redis-win32-win64 2.4.5 实现步骤: 1.安装 Redis ...
- 解决MySQL连接超时Communications link failure due to underlying exception
最近在用一个MySQL的Java连接池的过程中,连接一晚上不释放,第二天就会造成超时的错误,查了一下原因,原来是因为MySQL默认的空闲等待时间是8个小时,一旦空闲超过8个小时,就会抛出异常.异常文本 ...
- [Python]linux自己定义Python脚本命令
在window下写好的程序配置到Linux上,要实现随意文件夹下的命令调用. 因为初学Linux,这里从文件传输等最主要的方法入手,记录配置的过程中遇到的各种问题. 连接远端server 这里使用pu ...
- 信号之kill和raise函数
kill函数将信号发送给进程或进程组.raise函数则允许进程向自身发送信号. #include <signal.h> int kill(pid_t pid, int signo); in ...
- com.service.impl
package com.service.impl; import java.util.ArrayList; import java.util.LinkedHashMap; import java.ut ...
- Lipo Error!! can't open input file
参考文章:http://stackoverflow.com/questions/17348912/lipo-error-cant-open-input-file I got it to Work, i ...
- Hibernate: Truly Understanding the Second-Level and Query Caches--reference
I've written multiple articles here at Javalobby on the Hibernate O/R mapping tool, and they are usu ...
- ExtJs 下拉菜单分页工具插件 代码分析
Ext.ns("Ext.ux"); //创建插件对象 Ext.ux.PageSizePlugin = function(){ //调用父对象的构造方法,并为此插件生成一个预定义st ...