`

序列化与反序列化

 
阅读更多
分布式接口技术: webService,RMI,阿里json,谷歌msgpack

定义:
Serillization序列化 是一种对象按照一定规则生成出一连串的字符过程。
Deserialization反序列化 是一种将这些字符重新建成一个内存对象的过程。

场景:
当把内存中的对象保存到一个文件或者数据库的时候(持久化)。
当你需要在跨平台的环境下,通过网络传输对象的时候(webService soap)。
当你通过RMI传输对象的时候。

实现方式:
将要序列化的类实现Serializable接口就可以了。
Serializable没有任何方法,就是一个标记,表明这个类可以被实例化。

例子:
java默认的序列化规则:
package org.xdemo.example.SpringActivemq.service.consumer;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

public class SerialTest {

	public static void main(String[] args) throws ClassNotFoundException {
		
		String stuFileName = "student.out";
		
		Student serialStu = new Student("海龙", 11);
		serialize(serialStu, stuFileName);
		
		Student student = (Student)deserialize(stuFileName);
		System.out.println("name:" + student.getName() + ",age:"+ student.getAge());
		
	}

	/**
	 * 序列化
	 * @param obj
	 * @param outFile
	 */
	public static void serialize(Object obj, String outFile) {
		
		try {
			ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(outFile));
			
			//向磁盘中写入当前内存中对象的状态。
			oos.writeObject(obj);
			//清空
			oos.flush();
			//关闭
			oos.close();
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	/**
	 * 反序列化
	 * @param obj
	 * @param outFile
	 * @throws ClassNotFoundException 
	 */
	public static Object deserialize(String readFile) throws ClassNotFoundException {
		
		ObjectInputStream ois;
		Object object;
		try {
			ois = new ObjectInputStream(new FileInputStream(readFile));
			object = ois.readObject();
			ois.close();
			return object;
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}
}


package org.xdemo.example.SpringActivemq.service.consumer;

import java.io.Serializable;

public class Student implements Serializable{

	private String name;
	// transient static
	private int age;
	
	public Student(String name, int age) {
		this.name = name;
		this.age = age;
	}

	public String getName() {
		return name;
	}

//	public void setName(String name) {
//		this.name = name;
//	}

	public int getAge() {
		return age;
	}

//	public void setAge(int age) {
//		this.age = age;
//	}
	
	//jdk自动调用,扩展序列化规则的方法。
//	private void writeObject(ObjectOutputStream out) throws IOException{
//		out.defaultWriteObject();
//		out.writeInt(age);
//	}
//	
//	private void readObject(ObjectInputStream in) throws IOException,ClassNotFoundException{
//		in.defaultReadObject();
//		age = in.readInt();
//	}
}


序列化和反序列化的 序列化ID需要一样。
所以序列化ID在对跨平台,跨服务的时候设定一致。

如果我们想序列化一个对象,首先创建OutPutStream(如 FileOutPutStream等);
这时候,只需要直接调用writeObject()方法就可以将对象实例化,并将其发送给OutputStream
序列化基于字节,不使用Reader和Writer等基于字符层次的IO。

而反序列化(将一个序列还原成一个对象),需要将一个InputStream封装在ObjectInputStream中。
然后调用readObject。

影响序列化:
1 加上transient 可以不被序列化,用于敏感信息不要序列化。
2 被static静态变量修饰,也不能序列化。
3 重写writeObject方法与readObject方法。
4 实现接口Externalizable(正常是实现接口Serializable)
jdk不会调用默认序列化接口,使用自定义writeExternal和readExternal
5.用readResolve():当我们使用单例模式时,应该期望这个类实例是唯一的。
但是该类是可序列化的,那么情况可能不一样了,此时可以增加readResolve方法来实现,
确保在同一个jvm只有一个单例对象的引用。

两种数据类型,引用类型,值类型。
== 比 引用地址是否相同 浅克隆   序列化和反序列化后 == 是false
equals 比值是否相同 比如字符串内容 深克隆 序列化和反序列化后 equals 是true

在网络下的序列化:
1.java环境RMI(Remote Method Invoker)
仅限java平台,序列化效率低
2.webServer SOAP 简单对象传出协议
跨语言 跨平台 php .net
效率低 可读性差 基于xml传递
3.json(javaScript Object Notation javaScript 对象交换)
跨语言 跨平台
可读性强 序列化效率有所提高,但效率不是最高
阿里巴巴的fastjson1.2.4.jar
//序列化
String json = JSON.toJSONString(msgPack);
// {"age":8,"name":"海龙"}键值对存储 存储大小比msgPack大点
// msgPack是org.xdemo.example.SpringActivemq.service.consumer.MsgPack@69ac44c2
System.out.println(json);
// 反序列化
MsgPack msgPack3 =  JSON.parseObject(json, MsgPack.class);
System.out.println("name:" + msgPack3.name + ",age:"+ msgPack3.age + "_json");


<!-- 阿里巴巴https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
	<groupId>com.alibaba</groupId>
	<artifactId>fastjson</artifactId>
	<version>1.2.4</version>
</dependency>


4.新的序列类库MessagePack(谷歌)
效率高,序列化后文件小
需要jar:msgpack-0.6.12.jar,javassist-3.18.2-GA.jar

	 
<!-- 序列化msgpack -->
		<!-- https://mvnrepository.com/artifact/org.msgpack/msgpack -->
		<dependency>
		    <groupId>org.msgpack</groupId>
		    <artifactId>msgpack</artifactId>
		    <version>0.6.12</version>
		</dependency>
		<!-- https://mvnrepository.com/artifact/org.javassist/javassist -->
		<dependency>
		    <groupId>org.javassist</groupId>
		    <artifactId>javassist</artifactId>
		    <version>3.18.1-GA</version>
		</dependency>




	    
MsgPack msgPack = new MsgPack();
msgPack.name = "海龙";
msgPack.age= 8;
try {
	    	// 序列化
			byte[] arr = MessagePack.pack(msgPack);
			// 反序列化
			MsgPack msgPack2 =  MessagePack.unpack(arr, MsgPack.class);
			System.out.println("name:" + msgPack2.name + ",age:"+ msgPack2.age + "_msgPack");
			System.out.println(msgPack == msgPack2);
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}


package org.xdemo.example.SpringActivemq.service.consumer;

import org.msgpack.annotation.Message;

//redis2.6也支持MsgPack
@Message
public class MsgPack {

	public String name;
	
	public int age;
}


//用此方式测试时间
long msgpackStart = System.currentTimeMillis();
long msgpackEnd = System.currentTimeMillis();
System.out.println(msgpackEnd - msgpackStart);
分享到:
评论

相关推荐

    C++ JSON 序列化与反序列化

    本篇文章将深入探讨C++中JSON的序列化与反序列化。 **一、JSON序列化** 序列化是指将C++的对象转换为JSON字符串的过程,以便在网络上传输或保存到文件中。常见的C++ JSON序列化库有RapidJSON、nlohmann/json、...

    XML序列化与反序列化 实战

    XML序列化与反序列化是.NET框架中处理数据交换的重要技术,它允许我们将对象的状态转换为XML格式的数据,也可以将XML数据恢复为等效的对象。这个实战项目专注于使用C#实现这一过程,使得开发者能够方便地在XML文件和...

    Json序列化与反序列化

    总结来说,JSON序列化与反序列化是现代Web开发中不可或缺的一部分,它提供了数据交换的标准格式,使得不同语言和平台之间的数据交互变得简单高效。正确理解和使用这一技术,能够极大地提升开发效率和软件的可维护性...

    基于boost的序列化与反序列化

    在编程领域,序列化和反序列化是两个关键的概念,它们用于将对象的状态转换为可存储或可传输的格式,然后在需要时恢复为原始对象。Boost库提供了一个强大的工具——Boost.Serialization,来帮助程序员实现这个功能。...

    (转)客户端访问Web Service--参数类型的序列化与反序列化(二)

    在本文中,我们将深入探讨客户端访问Web Service时涉及的参数类型的序列化与反序列化,这是Web Service通信过程中的关键环节。 首先,我们要理解什么是序列化和反序列化。序列化是将对象的状态转换为可以存储或传输...

    hashtable序列化与反序列化

    本文将详细探讨标题所提及的“hashtable序列化与反序列化”,并提供一个基本的示例。 首先,让我们理解什么是序列化。序列化是将对象的状态转换为可存储或可传输的形式的过程。在Java中,对象序列化允许我们将一个...

    序列化与反序列化Demo

    序列化与反序列化是计算机科学中的重要概念,特别是在数据存储、网络通信和持久化对象等领域。简单来说,序列化是将对象的状态转换为可存储或传输的数据格式的过程,而反序列化则是将这种数据格式恢复为原来的对象...

    VB.NET XML和JSON序列化与反序列化

    在VB.NET编程环境中,XML和JSON序列化与反序列化是常见的数据处理技术,用于将对象转换为文本格式(XML或JSON),以便于存储、传输和解析。这两者都是轻量级的数据交换格式,广泛应用于Web服务和客户端应用程序之间...

    delphi序列化与反序列化

    本文将深入探讨Delphi中的序列化与反序列化,以及如何处理组件和结构体的序列化。 首先,让我们了解什么是序列化。序列化是指将一个对象的状态转换为可以存储或传输的数据格式的过程。这通常是一个二进制流或者XML...

    java serializable 序列化与反序列化

    Java的序列化与反序列化是Java开发中的一项重要技术,它允许我们将对象的状态转换为字节流,以便存储或在网络上传输。`Serializable`接口是Java提供的一个标记接口,用于实现对象的序列化。当一个类实现了这个接口,...

    xml文件的序列化与反序列化

    这是类编译后的dll动态链接库,其中含有对xml文件的序列化与反序列化操作,利用其可以实现对xml文件几乎全部的复杂操作。

    XmlDemoTranfer Xml序列化与反序列化

    Xml序列化与反序列化是.NET框架中一种重要的数据转换技术,主要应用于将对象的状态转换成XML格式的字符串,便于存储或传输,同时也能够将XML数据还原为对象。在C#编程中,这一功能通常通过System.Xml.Serialization...

    Java Json序列化与反序列化

    Java中的JSON(JavaScript Object Notation)序列化与反序列化是开发过程中常见且重要的操作,主要用于数据交换和存储。JSON是一种轻量级的数据交换格式,它允许我们将Java对象转换为JSON字符串,反之亦然,方便在...

    C#源码序列化与反序列化

    1. **什么是序列化与反序列化?** - **序列化**:是将对象的状态转化为可持久化的格式(如XML、JSON、二进制等),使得对象可以在不同时间点或者不同环境之间进行传输和保存。 - **反序列化**:是序列化的逆过程,...

    详细案例介绍json序列化与反序列化

    ### 详细案例介绍json序列化与反序列化 #### JSON简介 JSON(JavaScript Object Notation,JavaScript对象表示法)是一种轻量级的数据交换格式。它最初由Douglas Crockford提出,广泛应用于Web应用程序的数据传输中...

    JAVA对象的序列化与反序列化详细PPT课件.pptx

    Java对象的序列化和反序列化...总的来说,Java对象的序列化与反序列化是Java平台中一种强大的工具,它能够帮助开发者在多种场景下有效地处理对象数据。理解并掌握这项技术,对于提升Java应用程序的性能和功能至关重要。

    XML文件序列化与反序列化

    本篇文章将详细探讨XML文件的序列化与反序列化,并介绍如何读取XML文件中的指定节点。 **XML序列化** XML序列化是将对象的属性和字段转换为XML文档的过程。在.NET中,我们可以使用`XmlSerializer`类来实现这一功能...

    json序列化与反序列化实例

    在.NET框架中,处理JSON序列化与反序列化的任务通常由Json.NET库完成,这是一个强大的、高性能的JSON框架。 **JSON序列化** 是将对象转换为JSON字符串的过程。这使得数据可以在不同系统之间传递,因为JSON是一种...

Global site tag (gtag.js) - Google Analytics