我在生产中遇到了一个奇怪的问题:一个Java.util.日期字段随机减少了一天总数。这种情况很少发生,但有时会出问题,生产中日期会减少。
尝试创建自定义序列化程序和反序列化程序没有帮助。
以下是代码:
// UserData class
package mypackage;
import myotherpackage.DataDefaultPatternDeserializer;
import myotherpackage.DataDefaultPatternSerializer;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import lombok.Data;
import java.util.Date;
@Data
public class UserData {
//Random problems in production - date decreased by one day
@JsonSerialize(using = DataDefaultPatternSerializer.class)
@JsonDeserialize(using = DataDefaultPatternDeserializer.class)
private Date dateOfBirth;
}
// ----------------------------------------------------------------------------------------
// DataDefaultPatternSerializer class
package myotherpackage;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import java.io.IOException;
import java.util.Date;
import java.util.Locale;
import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
public class DataDefaultPatternSerializer extends JsonSerializer<Date> {
public DataDefaultPatternSerializer() {
}
public void serialize(Date date, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyyMMdd").withLocale(Locale.ITALY);
jsonGenerator.writeString(formatter.print(new DateTime(date)));
}
}
// ----------------------------------------------------------------------------------------
// DataDefaultPatternDeserializer class
package myotherpackage;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import java.io.IOException;
import java.util.Date;
import java.util.Locale;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
public class DataDefaultPatternDeserializer extends JsonDeserializer<Date> {
public DataDefaultPatternDeserializer() {
}
public Date deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException {
DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyyMMdd").withLocale(Locale.ITALY);
String dateString = jsonParser.getText();
return formatter.parseDateTime(dateString).toDate();
}
}
有解决办法吗?
切勿使用任何一种Date
class。这些糟糕的类在几年前被现代java所取代。JSR 310中定义的时间类。
还有,java。util。日期
表示一个时刻,一个以UTC为单位的日期,其时间偏移量为零分秒。您试图将仅限日期的值(出生日期)与UTC类型的带时间的日期相匹配。
对于出生日期,请使用仅限日期的类型,LocalDate
。
LocalDate ld = LocalDate.parse( "1969-01-23" ) ;
要生成标准ISO 8601格式的文本,请调用toString
。
String outputISO8601 = ld.toString() ;
将日期-时间值序列化为文本时,请使用ISO 8601格式。
Jackson支持java.time类型。
要向数据库写入类型类似于SQL标准类型DATE
的列:
myPreparedStatement.setObject( … , ld ) ;
检索。
LocalDate ld = myResultSet.getObject( … , LocalDate.class ) ;
主要内容:1 Java序列化和反序列化,2 Java序列化的优点,3 java.io.Serializable接口,4 Java ObjectOutputStream,5 Java ObjectInputStream,6 Java序列化的例子,7 Java反序列化的例子1 Java序列化和反序列化 Java中的序列化是一种将对象状态写入字节流的机制。它主要用于Hibernate,RMI,JPA,EJB和JMS技术。 序列化的反向操作称为反序列化,其中字节流被转换为对象。序列化和反序列化过程与平台
问题内容: 我尝试过在Java和Android之间实现跨平台序列化。我使用了Serializable,并将我的代码在Android中与台式机Java放在同一软件包中。 来源:java-desktop序列化 资料来源:Android-反序列化 学生是一类,实现了Serializable。在桌面上,我将学生实例序列化为“ thestudent.dat”。我将此文件放在Android设备上的SD卡上,并
上一小节我们学习了 Java 的输入输出流,有了这些前置知识点,我们就可以学习 Java 的序列化了。本小节将介绍什么是序列化、什么是反序列化、序列化有什么作用,Serializable 接口以及 Externalizable 接口,常用序列化工具介绍等内容。 1. 序列化与反序列化 序列化在计算机科学的数据处理中,是指将数据结构或对象状态转换成可取用格式,以留待后续在相同或另一台计算机环境中,能
奇怪的是下面的测试用例会失败。有人知道为什么吗?
问题内容: 我注意到存储在Redis中的某些序列化对象在反序列化方面遇到问题。 当我对Redis中存储的对象类进行更改时,通常会发生这种情况。 我想了解问题,以便为解决方案设计一个清晰的方案。 我的问题是,什么导致反序列化问题?移除公共/私人财产会引起问题吗?也许添加新属性?向类添加新功能会产生问题吗?那么更多的构造函数呢? 在我的序列化对象中,我有一个属性Map,如果我更改(更新了一些属性,添加
问题内容: Golang中将结构序列化和反序列化为字符串的最佳方法(完整性和性能)是什么,反之亦然? 例如,如果我有这个结构: 我想将其存储在Redis上并取回。我试过保存,整型和字符串,这很好,但是如何存储结构对象? 问题答案: 使用gob和base64可以解决问题,例如: 当您需要序列化自定义结构或类型(例如struct)时,只需添加以下行: