对日期类型的数据进行序列化和反序列化时,需要考虑如下问题:
1. 序列化时,Date对象序列化的字符串日期格式如何
2. 反序列化时,把日期字符串序列化为Date对象,也需要考虑日期格式问题
3. Date A -> str -> Date B,A和B对象是否equals
默认序列化和反序列化
import com.google.gson.Gson; import com.google.gson.GsonBuilder; import java.util.Date; class Model { private Date date; public Date getDate() { return date; } public void setDate(Date date) { this.date = date; } } public class Tests { public static void main(String[] args) { Model m = new Model(); Date d = new Date(); System.out.println(new Date()); //Wed Aug 13 13:27:01 CST 2014 m.setDate(d); String str = new Gson().toJson(m); System.out.println(str); //{"date":"Aug 13, 2014 1:27:01 PM"} m = new Gson().fromJson(str, Model.class); System.out.println(d.getTime()); //1407907621908 System.out.println(m.getDate().getTime()); //1407907621000 System.out.println(d.equals(m.getDate())); //false } }
1. System.out.println(new Date()),日期格式根据操作系统的Locale,这里是CST(中国标准时间,东八区),而Gson把Date序列化为字符串时,默认的时间格式是GMT标准时间
2. 将Date对象A序列化,然后把得到的日期字符串进行反序列化得到对象B,此时B和A并不相等!!这是为什么?原因是JSON在将日期字符串反序列化时,默认将毫秒数进行割断,所以输出的毫秒数最后是3个0,Gson应该提供方法把这种默认的转换(数据已失真)替换掉
指定序列化和反序列化的日期格式
使用GsonBuilder的setDateFormat来指定Date对象序列化的日期格式以及日期字符串反序列化为Date对象的日期格式
import com.google.gson.Gson; import com.google.gson.GsonBuilder; import java.util.Date; class Model { private Date date; public Date getDate() { return date; } public void setDate(Date date) { this.date = date; } } public class Tests { public static void main(String[] args) { Model m = new Model(); Date d = new Date(); System.out.println(new Date()); //Wed Aug 13 13:36:32 CST 2014 m.setDate(d); Gson gson = new GsonBuilder().setDateFormat("YYYY-MM-dd HH:mm:ss").create(); String str = gson.toJson(m); System.out.println(str); //{"date":"2014-08-13 13:36:32"} m = gson.fromJson(str, Model.class); System.out.println(d.getTime()); //1407908192881 System.out.println(m.getDate().getTime()); //1388295392000 } }
1.使用GsonBuilder.setDateFormat()可以按照指定的日期格式进行序列化和反序列化,
2.同样,这种方式下,反序列化回来的日期对象,毫秒数依然被割断
注意的问题
我们可以按照指定的日期格式进行序列化和反序列化,但是格式必须要一致,否则就会发生解析错误,比如下面的代码序列化和反序列化使用的日期格式不一致,导致反序列化失败
import com.google.gson.Gson; import com.google.gson.GsonBuilder; import java.util.Date; class Model { private Date date; public Date getDate() { return date; } public void setDate(Date date) { this.date = date; } } public class Tests { public static void main(String[] args) { Model m = new Model(); Date d = new Date(); System.out.println(new Date()); //Wed Aug 13 13:36:32 CST 2014 m.setDate(d); String str = new Gson().toJson(m); System.out.println(str); //{"date":"Aug 13, 2014 1:42:13 PM"} Gson gson = new GsonBuilder().setDateFormat("YYYY-MM-dd HH:mm:ss").create(); //Exception /*Caused by: java.text.ParseException: Unparseable date: "Aug 13, 2014 1:43:37 PM" at java.text.DateFormat.parse(DateFormat.java:357) at com.google.gson.DefaultDateTypeAdapter.deserializeToDate(DefaultDateTypeAdapter.java:105) ... 15 more*/ gson.fromJson(str, Model.class); } }
反序列化时,毫秒数被割断问题,以后再看什么回事
相关推荐
本篇文章将深入探讨如何在使用Gson时进行自定义的序列化和反序列化,以及在遇到后端返回的数据类型与预期不符时的处理策略。 ### Gson自定义序列化 自定义序列化主要是为了在转换Java对象为JSON时,根据特定需求...
然而,在使用Gson库进行JSON序列化和反序列化时,枚举处理默认方式可能无法满足所有需求。本篇文章将详细探讨如何通过自定义Gson适配器实现枚举类型的统一序列化和反序列化处理,无需预先定义枚举,也无需修改Gson...
1. 复杂类型的处理:除了基本类型外,还可以序列化和反序列化自定义类、结构体以及容器(如vector、map等)。对于自定义类型,通常需要重载`operator和`operator>>`,或者使用nlohmann/json库中的`to_json`和`from_...
Gson的主要功能是通过`Gson.toJson()`方法实现对象到JSON的序列化,以及`Gson.fromJson()`方法实现JSON到对象的反序列化。Gson还支持自定义类型转换器,可以满足定制化的需求。 3. **Jackson**:Jackson是由...
在Java开发中,序列化和反序列化是数据转换的重要环节,主要用于将对象转换为可存储或传输的数据格式,如JSON字符串,以及将这些数据还原为原来的对象。本压缩包包含fastJson、Gson和Jackson这三种流行JSON库的jar...
在Java编程语言中,对象的序列化和反序列化是两个关键的概念,它们允许我们将对象的状态转换为可存储或传输的格式,然后再恢复为原始对象。这个过程对于数据持久化、网络传输以及跨进程通信等场景非常有用。下面将...
Java中,除了基本的序列化机制,还有许多第三方库如Jackson、Gson等,它们提供了更高效、更灵活的JSON序列化和反序列化功能。例如,Jackson库的`ObjectMapper`类能够方便地将Java对象转换为JSON字符串,反之亦然。 ...
Gson 中解决 json 反序列化时相同属性对应不同类型的值的问题(代码),对应文章链接:https://blog.csdn.net/ZiFung_Yip/article/details/89143255
在计算机科学领域,序列化和反序列化是两个至关重要的概念,特别是在数据传输、存储以及对象持久化等场景。这两个过程对于理解数据流如何在内存、磁盘和网络之间转换至关重要。 序列化是指将对象的状态转化为可存储...
在IT领域,序列化是将对象的状态转换为可存储或传输的形式的过程,而反序列化则是将这种形式恢复为原始对象。在这个主题中,我们将深入探讨四种常用的序列化工具:Gson, Jackson, FastJson和ProtoBuf,以及与...
总结,Java中的JSON序列化与反序列化是数据交互的重要环节,Jackson和Gson是两个常用的库,它们提供了丰富的功能和良好的API设计,使得处理JSON数据变得简单高效。通过理解和掌握这些知识,开发者可以更好地在Java...
在计算机科学中,序列化和反序列化是两个重要的概念,尤其在对象持久化、数据传输和跨进程通信中扮演着关键角色。本篇文章将详细探讨这两个概念,并以Java语言为例,阐述如何实现对象的序列化和反序列化。 首先,...
本文将深入探讨如何利用Gson库进行多枚举类型的统一序列化和反序列化处理,以此避免为每个枚举类型单独创建Adapter。 首先,我们需要了解Gson的基本用法。Gson的核心类是`Gson`,它提供了`toJson()`和`fromJson()`...
在本文中,我们将深入探讨关于Java对象序列化你可能不知道的五件事情,这些知识点对于理解和优化你的Java应用程序至关重要。 1. **序列化的意义与用途** Java对象序列化不仅用于持久化对象状态,还能在网络传输中...
- 除了Java内置的序列化机制,还可以使用JSON(JavaScript Object Notation)进行序列化,例如Gson、Jackson和Fastjson等库,它们能将Java对象转换成JSON字符串,方便在网络间传输,并且更易于人类阅读。...
在Android平台上,Java对象反序列化是一个常见的操作,它涉及到将序列化的数据转换回原来的对象实例。这在数据存储、网络通信以及跨进程通信(IPC)等场景中扮演着重要角色。本文将深入探讨Android上Java对象反序列...
序列化与反序列化是计算机科学中的重要概念,特别是在数据存储、网络通信和持久化对象等领域。简单来说,序列化是将对象的状态转换为可存储或传输的数据格式的过程,而反序列化则是将这种数据格式恢复为原来的对象...
1. **序列化与反序列化**:Gson库的主要任务是将Java对象转换成JSON字符串(序列化),以及将JSON字符串解析为对应的Java对象(反序列化)。例如,你可以通过`Gson().toJson()`方法将一个Java对象转换成JSON,同时...
Java序列化和反序列化是将对象的状态转换为字节流和从字节流恢复对象状态的过程,这对于数据持久化、网络传输以及跨进程通信等场景至关重要。在Java中,`java.io.Serializable`接口用于标记一个类是可序列化的。然而...
本文将深入探讨JSON的序列化与反序列化过程,以及如何使用Gson、FastJson和Jackson这三种流行的Java库来实现这一功能。 一、什么是JSON序列化与反序列化? 1. JSON序列化:序列化是指将Java对象转换为JSON字符串的...