java序列化对象的方法

合集下载

Java反序列化创建对象探析

Java反序列化创建对象探析

Java反序列化创建对象探析通过反序列化⽣成对象的过程主要由以下⼏个步骤:1、创建⼀个对象输⼊流,它可以包装⼀个其他类型的源输⼊流,如⽂件输⼊流;2、通过对象输⼊流的readObject()⽅法读取对象。

其中正是readObject⽅法返回了⼀个对象,这个对象就是根据序列化⽣成的⽂件⽽创建的对象,所以反序列化如何创建对象关键就在于readObject⽅法的实现,那就来探析⼀下它的实现,它的源码如下:public final Object readObject()throws IOException, ClassNotFoundException{if (enableOverride) {return readObjectOverride();}// if nested read, passHandle contains handle of enclosing objectint outerHandle = passHandle;try {Object obj = readObject0(false);handles.markDependency(outerHandle, passHandle);ClassNotFoundException ex = handles.lookupException(passHandle);if (ex != null) {throw ex;}if (depth == 0) {vlist.doCallbacks();}return obj;} finally {passHandle = outerHandle;if (closed && depth == 0) {clear();}}}这个⽅法会从对象输⼊流中读取⼀个对象,其中还包括这个对象的类名、类的签名、类的⾮静态⾮瞬时属性值、以及它的所有超类。

该对象所引⽤的对象是传递式读取的,所以readObject⽅法可以重建对象的完整等效图,也就复刻⼀个和原来被序列化对象⼀样的对象。

Java对象的序列化与反序列化-Json篇

Java对象的序列化与反序列化-Json篇

Java对象的序列化与反序列化-Json篇说到Java对象的序列化与反序列化,我们⾸先想到的应该是Java的Serializable接⼝,这玩意在两个系统之间的DTO对象⾥⾯可能会⽤到,⽤于系统之间的数据传输。

或者在RPC(远程⽅法调⽤)时可能会⽤到。

但其实若是⽤于数据传输,xml和json两种数据格式⽤得更多⼀些。

但是为什么不⽤XStream呢,XStream确实好⽤,但是在Applet环境下可以使⽤的xml类库也就只有jdom了,连dom4j在Applet环境下都没有权限使⽤(Java反射的某些特性是需要权限的,Applet的安全机制不允许)。

扯远了,本⽂要说的是Java对象与Json的相互转换。

⽬前Java常⽤的Json类库有3种,即fastjson、jackson和gson,分别介绍如何将⼀个Java对象转换成Json和将⼀个Json字符串转换成Java对象,其实它们的⽤法⼤同⼩异。

⼀、⾸先看Maven依赖⼆、需要序列化的POJO和初始化代码三、fastjson的使⽤四、jackson的使⽤五、gson的使⽤⼀、⾸先看Maven依赖若不会maven,请参考Maven的基本⽤法:1 <!-- json -->2 <!-- 引⼊fastjson依赖 -->3 <dependency>4 <groupId>com.alibaba</groupId>5 <artifactId>fastjson</artifactId>6 <version>1.2.12</version>7 </dependency>8 <!-- 引jackson依赖 -->9 <!-- jackson核⼼包,必选,提供基于“流模式”解析的API -->10 <dependency>11 <groupId>com.fasterxml.jackson.core</groupId>12 <artifactId>jackson-core</artifactId>13 <version>2.7.4</version>14 </dependency>15 <!-- jackson注解包,可选,提供注解功能 -->16 <dependency>17 <groupId>com.fasterxml.jackson.core</groupId>18 <artifactId>jackson-annotations</artifactId>19 <version>2.7.4</version>20 </dependency>21 <!-- jackson数据绑定包,可选,提供基于“对象绑定”和“树模型”相关API -->22 <dependency>23 <groupId>com.fasterxml.jackson.core</groupId>24 <artifactId>jackson-databind</artifactId>25 <version>2.7.4</version>26 </dependency>27 <!-- 引⼊gson依赖 -->28 <dependency>29 <groupId>com.google.code.gson</groupId>30 <artifactId>gson</artifactId>31 <version>2.6.2</version>32 </dependency>⼆、需要序列化的POJO和初始化代码以下3种类库的使⽤均使⽤下⾯这个POJO1public class User {2public User(){}3private String id;4private String name;5private String password;6public String getId() {7return id;8 }9public void setId(String id) {10this.id = id;11 }12public String getName() {13return name;14 }15public void setName(String name) { = name;17 }18public String getPassword() {19return password;20 }21public void setPassword(String password) {22this.password = password;23 }24 @Override25public String toString() {26return"User [id=" + id + ", name=" + name + ", password=" + password27 + "]";28 }29 }1/**2 * 初始化User对象3 * @return user4*/5private static User initUser(){6 User user = new User();7 user.setId("1");8 user.setName("jison");9 user.setPassword("jison");10return user;11 }三、fastjson的使⽤fastjson的主要⼯具类是JSON,以下代码实现Java对象的序列化与反序列化1// 将Java对象序列化为Json字符串2 String objectToJson = JSON.toJSONString(initUser());3 System.out.println(objectToJson);4// 将Json字符串反序列化为Java对象5 User user = JSON.parseObject(objectToJson, User.class);6 System.out.println(user);四、jackson的使⽤jackson我们经常⽤到的是它的数据绑定包下的ObjectMapper类,以下代码实现Java对象的序列化与反序列化ObjectMapper objectMapper = new ObjectMapper();// 将Java对象序列化为Json字符串String objectToJson = objectMapper.writeValueAsString(initUser());System.out.println(objectToJson);// 将Json字符串反序列化为Java对象User user = objectMapper.readValue(objectToJson, User.class);System.out.println(user);五、gson的使⽤gson的主要⼯具类是Gson,使⽤GsonBuilder构造,以下代码实现Java对象的序列化与反序列化1 Gson gson = new GsonBuilder().create();2// 将Java对象序列化为Json字符串3 String objectToJson = gson.toJson(initUser());4 System.out.println(objectToJson);5// 将Json字符串反序列化为Java对象6 User user = gson.fromJson(objectToJson, User.class);7 System.out.println(user);以上3种json类库的完整代码如下:1public class JsonUtils {23/**4 * 初始化User对象5 * @return user6*/7private static User initUser(){8 User user = new User();9 user.setId("1");10 user.setName("jison");11 user.setPassword("jison");12return user;13 }1415public static void main(String[] args) throws Exception {16// fastjson⽤法17 fastjson();18// jackson⽤法19 jackson();20// gson⽤法21 gson();22 }2324private static void fastjson(){25// 将Java对象序列化为Json字符串26 String objectToJson = JSON.toJSONString(initUser());27 System.out.println(objectToJson);28// 将Json字符串反序列化为Java对象29 User user = JSON.parseObject(objectToJson, User.class);30 System.out.println(user);31 }3233private static void jackson() throws Exception{34 ObjectMapper objectMapper = new ObjectMapper();35// 将Java对象序列化为Json字符串36 String objectToJson = objectMapper.writeValueAsString(initUser());37 System.out.println(objectToJson);38// 将Json字符串反序列化为Java对象39 User user = objectMapper.readValue(objectToJson, User.class);40 System.out.println(user);41 }4243private static void gson(){44 Gson gson = new GsonBuilder().create();45// 将Java对象序列化为Json字符串46 String objectToJson = gson.toJson(initUser());47 System.out.println(objectToJson);48// 将Json字符串反序列化为Java对象49 User user = gson.fromJson(objectToJson, User.class);50 System.out.println(user);51 }52 }。

java序列化和serialVersionUID的使用方法实例

java序列化和serialVersionUID的使用方法实例

java序列化和serialVersionUID的使⽤⽅法实例java序列化和serialVersionUID的使⽤⽅法实例1、序列化:序列化可以将⼀个java对象以⼆进制流的⽅式在⽹络中传输并且可以被持久化到数据库、⽂件系统中,反序列化则是可以把之前持久化在数据库或⽂件系统中的⼆进制数据以流的⽅式读取出来重新构造成⼀个和之前相同内容的java对象。

2、序列化的作⽤:第⼀种:⽤于将java对象状态储存起来,通常放到⼀个⽂件中,使下次需要⽤到的时候再读取到它之前的状态信息。

第⼆种:可以让java对象在⽹络中传输。

3、序列化的实现:1)、需要序列化的类需要实现Serializable接⼝,该接⼝没有任何⽅法,只是标⽰该类对象可被序列化。

2)、序列化过程:使⽤⼀个输出流(如:FileOutputStream)来构造⼀个ObjectOutputStream(对象流)对象,接着,使⽤ObjectOutputStream对象的writeObject(Object obj)⽅法就可以将参数为obj的对象写出(即保存其状态)3)、反序列化过程:使⽤⼀个输⼊流(如:FileInputStream)来构造⼀个ObjectInputStream(对象流)对象,接着,使⽤ObjectInputStream对象的readObject(Object obj)⽅法就可以将参数为obj的对象读出(即获取其状态)4、静态long类型常量serialVersionUID的作⽤:如果没有设置这个值,你在序列化⼀个对象之后,改动了该类的字段或者⽅法名之类的,那如果你再反序列化想取出之前的那个对象时就可能会抛出异常,因为你改动了类中间的信息,serialVersionUID是根据类名、接⼝名、成员⽅法及属性等来⽣成⼀个64位的哈希字段,当修改后的类去反序列化的时候发现该类的serialVersionUID值和之前保存在问价中的serialVersionUID 值不⼀致,所以就会抛出异常。

什么是Java序列化,如何实现java序列化

什么是Java序列化,如何实现java序列化

什么是Java序列化,如何实现java序列化简要解释: 序列化就是⼀种⽤来处理对象流的机制,所谓对象流也就是将对象的内容进⾏流化。

可以对流化后的对象进⾏读写操作,也可将流化后的对象传输于⽹络之间。

序列化是为了解决在对对象流进⾏读写操作时所引发的问题。

序列化的实现:将需要被序列化的类实现Serializable接⼝,该接⼝没有需要实现的⽅法,implements Serializable只是为了标注该对象是可被序列化的,然后使⽤⼀个输出流(如:FileOutputStream)来构造⼀个ObjectOutputStream(对象流)对象,接着,使⽤ObjectOutputStream对象的writeObject(Object obj)⽅法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则⽤输⼊流。

详细解释:当两个进程在进⾏远程通信时,彼此可以发送各种类型的数据。

⽆论是何种类型的数据,都会以⼆进制序列的形式在⽹络上传送。

发送⽅需要把这个Java对象转换为字节序列,才能在⽹络上传送;接收⽅则需要把字节序列再恢复为Java对象。

只能将⽀持 java.io.Serializable 接⼝的对象写⼊流中。

每个 serializable 对象的类都被编码,编码内容包括类名和类签名、对象的字段值和数组值,以及从初始对象中引⽤的其他所有对象的闭包。

1.概念 序列化:把Java对象转换为字节序列的过程。

反序列化:把字节序列恢复为Java对象的过程。

2.⽤途 对象的序列化主要有两种⽤途: 1)把对象的字节序列永久地保存到硬盘上,通常存放在⼀个⽂件中; 2)在⽹络上传送对象的字节序列。

3.对象序列化序列化API java.io.ObjectOutputStream代表对象输出流,它的writeObject(Object obj)⽅法可对参数指定的obj对象进⾏序列化,把得到的字节序列写到⼀个⽬标输出流中。

javajson序列化 parseobject方法

javajson序列化 parseobject方法

javajson序列化 parseobject方法Java JSON序列化简介在Java开发中,我们经常需要将对象转换成JSON格式进行传输或存储。

Java提供了多种方式来实现JSON序列化,其中最常用的方式是使用parseObject方法。

使用parseObject方法概述parseObject方法是阿里巴巴的FastJSON库提供的一种JSON序列化方法。

它可以将一个JSON字符串转换为Java对象。

示例以下是使用parseObject方法的简单示例:String jsonStr = "{\"name\":\"John\", \"age\":30}";// 将JSON字符串转换为Java对象Person person = (jsonStr, );// 输出结果(()); // 输出:John(()); // 输出:30方法参数parseObject方法有两个主要参数: 1. JSON字符串:需要转换的JSON字符串。

2. Java对象的类型:要将JSON字符串转换为哪种类型的Java对象。

支持的类型parseObject方法支持将JSON字符串转换为以下类型的Java对象: - 基本类型:如int、float、boolean等。

- 包装类型:如Integer、Float、Boolean等。

- 字符串类型:如String、StringBuilder等。

- 数组类型:如int[]、String[]等。

- 集合类型:如List、Set等。

- 自定义类型:自定义的Java类。

字符编码JSON字符串默认使用的是UTF-8字符编码。

如果需要使用其他字符编码,可以通过charset参数进行设置:String jsonStr = "{\"name\":\"John\", \"age\":30}";// 将JSON字符串转换为Java对象,使用GBK字符编码Person person = (jsonStr, , ("GBK"));其他JSON序列化方法除了parseObject方法外,还有其他几种常见的JSON序列化方式: ### toJSONString方法toJSONString方法可以将一个Java对象转换为JSON字符串。

数据序列化技术

数据序列化技术

数据序列化技术数据序列化技术是一种将数据结构或对象转换为可传输或存储格式的技术,通常用于网络通信和跨平台数据交换。

该技术能够将复杂的数据结构编码成二进制数据流,从而实现数据的传输和存储,同时还能够解码数据并还原成原始对象或数据结构。

在网络通信中,数据序列化技术可以将应用层协议中的数据结构转换为二进制格式,以便于在网络上传输。

这样做的好处是可以提高传输效率和数据安全性,同时还能够兼容不同的编程语言和操作系统平台。

在跨平台数据交换中,数据序列化技术可以将不同语言和平台上的数据结构转换成统一的二进制格式,从而实现数据的互通和协作。

这可以为软件系统的开发和集成提供更大的灵活性和可扩展性。

数据序列化技术主要包括两个方面:编码和解码。

编码指将数据结构或对象编码为二进制格式,而解码则是将二进制格式的数据解析还原成原始数据结构或对象。

下面主要介绍常见的数据序列化技术及其实现方式。

1. JSONJSON(JavaScript Object Notation)是一种轻量级的数据交换格式,由JavaScript 语言发明。

它基于键值对的结构表示数据,具有易于阅读和编写的特点。

JSON格式的数据可以在不同的编程语言和操作系统平台间互通。

在Java语言中,可以使用Gson框架实现JSON的编码和解码。

Gson提供了一组API,可以将Java对象序列化为JSON格式的字符串或将JSON格式的字符串反序列化为Java对象。

下面是一个使用Gson对Java对象进行序列化和反序列化的例子:```javaimport com.google.gson.Gson;public class Person{private String name;private int age;//序列化对象Person person = new Person();person.setName("Lucy");person.setAge(20);Gson gson = new Gson();String json = gson.toJson(person);System.out.println(json);2. XMLXML(eXtensible Markup Language)是一种常用的标记语言,用于描述数据结构和传输格式。

Java基础利用fastjson反序列化json为对象和对象数组

Java基础利用fastjson反序列化json为对象和对象数组
//增加get/sclass Menu {
private String type; private String index; private String name;//菜单名 private boolean expanded; private String icon; private String link; private List<Menu> children;//子菜单
注意:json字符串的关键字一定要与 java.class 中的对应变量名相同
实例1:JSON转化为HashMap&ArrayList
【0】首先在Maven中引入fastjson(pom.xml中引入依赖)
<dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.0.4</version>
一、反序列化函数
1、parseObject [将 json字符串 反序列化为 java.class]
//transform the json to T -fastjson 为 json格式的字符串(String类型) -T 为 与 json格式对应的自定义java.class @sherineZJU List<T> temp= JSON.parseObject(fastjson,T.class);
name: '菜单A-2', expanded: false, icon: 'phone', link: '/menu2', children: [] }, ] }]

java嵌套对象序列化_java–使用RestTemplate反序列化嵌套对象

java嵌套对象序列化_java–使用RestTemplate反序列化嵌套对象

java嵌套对象序列化_java–使用RestTemplate反序列化嵌套对象使用RestTemplate反序列化嵌套对象是在Java中进行网络请求和处理返回数据的一种常见方式。

在这个过程中,我们通常会遇到需要将返回的数据序列化成嵌套对象的情况。

嵌套对象是指一个对象中包含了其他对象作为其属性或字段的情况。

例如,假设我们有一个User对象,其中包含一个Address对象作为其属性。

在进行网络请求时,我们可能会得到一个包含User对象的JSON字符串,其中包含了Address对象的信息。

首先,我们需要定义一个User类和一个Address类来表示嵌套对象的结构。

```javapublic class Userprivate String name;private int age;private Address address;// 省略构造函数、getter和setter方法public class Addressprivate String city;private String street;private int zipCode;// 省略构造函数、getter和setter方法```接下来,我们可以使用RestTemplate来发送网络请求,并将返回的数据反序列化成嵌套对象。

```javaRestTemplate restTemplate = new RestTemplate(;User user = restTemplate.getForObject(url, User.class);```在这里,我们使用RestTemplate的`getForObject`方法发送GET请求,并将返回的JSON字符串反序列化成User对象。

但是,这样的方式只能将最外层的User对象正确反序列化,而不能正确反序列化嵌套的Address对象。

为了解决这个问题,我们需要使用Jackson库提供的`TypeReference`类。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

java序列化对象的方法
我们为大家收集整理了关于java序列化对象,以方便大家参考。

ObjectOutputStream
 类用来序列化一个对象,如下的SerializeDemo例子实例化了一个Employee对象,并将该对象序列化到一个文件中。

 该程序执行后,就创建了一个名为employee.ser文件。

该程序没有任何输出,但是你可以通过代码研读来理解程序的作用。

 注意:
 当序列化一个对象到文件时,按照Java的标准约定是给文件一个.ser扩展名。

 import java.io.*;public class SerializeDemo{ public static void main(String
 [] args) { Employee e = new Employee(); = “Reyan Ali”;
e.address = “Phokka Kuan, Ambehta Peer”; e.SSN = 11122333; e.number =
 101; try { FileOutputStream fileOut = new
 FileOutputStream(“/tmp/employee.ser”); ObjectOutputStream out = new ObjectOutputStream(fileOut); out.writeObject(e); out.close();
 fileOut.close(); System.out.printf(“Serialized data is saved in
 /tmp/employee.ser”); }catch(IOException i) {
i.printStackTrace(); } }}
 希望大家学业有成,工作顺利。

相关文档
最新文档