- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
序列化 ZonedDateTime 时出错(它根本不会出现在输出 xml 中):
java.lang.InstantiationException:java.time.ZonedDateTime
继续...
java.lang.RuntimeException:无法评估:=Class.new();
继续...
我有一个该类的实例,其中一个字段的类型为 ZonedDateTime。当我尝试使用 XMLEncoder 序列化对象时:
import java.beans.XMLEncoder;
我收到此错误。在输出文件中,除了带有 ZonedDateTime 的字段之外,所有其他字段都会出现
这个包含 ZonedDateTime 的字段看起来像这样,例如:
ZonedDateTime date = ZonedDateTime.parse("2010-01-10T00:00:00Z[CET]");
有没有办法将其转换为可以使用的日期格式?例如
ZonedDateTime.parse("2010-01-10T00:00:00").toLocalDateTime().atZone(ZoneId.of("CET")
上面的写法(使用.toLocalDateTime())可能没有任何意义,但这只是示例。
我实际上正在序列化这些对象的整个列表,因此错误出现多次(并且在 xml 文件中始终没有输出)
最佳答案
XMLEncoder 和 XMLDecoder 旨在与常规 Java bean 类一起使用。通常,这些类具有公共(public)零参数构造函数和公共(public)属性访问器方法。对其他类有一些支持,例如那些具有采用属性值的构造函数的类,但大多数 java.time 类都不同,并且没有对它们的内置支持。
幸运的是,您可以提供自己的支持,通过specifying a PersistenceDelegate对于您计划序列化的每个非 Java-bean 类。
因此,第一步是为 ZonedDateTime 提供 PersistenceDelegate:
PersistenceDelegate zonedDateTimeDelegate = new PersistenceDelegate() {
@Override
protected Expression instantiate(Object target,
Encoder encoder) {
ZonedDateTime other = (ZonedDateTime) target;
return new Expression(other, ZonedDateTime.class, "of",
new Object[] {
other.getYear(),
other.getMonthValue(),
other.getDayOfMonth(),
other.getHour(),
other.getMinute(),
other.getSecond(),
other.getNano(),
other.getZone()
});
}
};
encoder.setPersistenceDelegate(
ZonedDateTime.class, zonedDateTimeDelegate);
但事实证明这还不够,因为 ZonedDateTime 的部分也被序列化,其中之一是 ZoneId。所以我们还需要一个 ZoneId 的 PersistenceDelegate。
PersistenceDelegate 很容易编写:
PersistenceDelegate zoneIdDelegate = new PersistenceDelegate() {
@Override
protected Expression instantiate(Object target,
Encoder encoder) {
ZoneId other = (ZoneId) target;
return new Expression(other, ZoneId.class, "of",
new Object[] { other.getId() });
}
};
但是注册它并不那么容易。 encoder.setPersistenceDelegate(ZoneId.class, zoneIdDelegate);
不起作用,因为 ZoneId 是一个抽象类,这意味着没有 ZoneId 对象,只有子类的实例。 XMLEncoder 在检查 PersistenceDelegates 时不会引用继承。每个要序列化的对象的每个类都必须有一个 PersistenceDelegate。
如果您只序列化一个 ZonedDateTime,解决方案很简单:
encoder.setPersistenceDelegate(
date.getZone().getClass(), zoneIdDelegate);
如果您有它们的集合,您可以检查它们的所有 ZoneId 类:
Set<Class<? extends ZoneId>> zoneClasses = new HashSet<>();
for (ZonedDateTime date : dates) {
Class<? extends ZoneId> zoneClass = date.getZone().getClass();
if (zoneClasses.add(zoneClass)) {
encoder.setPersistenceDelegate(zoneClass, zoneIdDelegate);
}
}
如果您有包含 ZonedDateTimes 的聚合对象,您可以简单地以类似的方式迭代它们并访问这些 ZonedDateTime 值。
关于java - 如何将 Java ZonedDateTime 序列化为 XML 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58809573/
出于好奇,我尝试了一些原型(prototype)制作,但似乎只允许在第一个位置使用子例程的原型(prototype) &。 当我写作时 sub test (&$$) { do_somethin
我需要开发一个类似于 Android Play 商店应用程序或类似 this app 的应用程序.我阅读了很多教程,发现几乎每个教程都有与 this one 类似的例子。 . 我已经开始使用我的应用程
考虑一个表示“事件之间的时间”的列: (5, 40, 3, 6, 0, 9, 0, 4, 5, 18, 2, 4, 3, 2) 我想将这些分组到 30 个桶中,但桶会重置。期望的结果: (0, 1,
我是一名优秀的程序员,十分优秀!