LocalDate序列化错误

编程入门 行业动态 更新时间:2024-10-27 22:34:32
本文介绍了LocalDate序列化错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

序列化包含LocalDate字段的类会导致以下错误:

Serializing a class that contains a LocalDate field causes the following error:

java.lang.InstantiationException: java.time.LocalDate Continuing ... java.lang.RuntimeException: failed to evaluate: <unbound>=Class.new(); Continuing ...

主类代码:

package javaapplication15; import java.beans.XMLEncoder; import java.io.BufferedOutputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.time.LocalDate; /** * * @author hoshantm */ public class JavaApplication15 { /** * @param args the command line arguments */ public static void main(String[] args) throws FileNotFoundException, IOException { JavaApplication15 japp = new JavaApplication15(); japp.serializaData(); } public void serializaData() throws FileNotFoundException, IOException { XMLEncoder e = new XMLEncoder(new BufferedOutputStream( new FileOutputStream("d:\\temp\\Test.xml"))); Employee emp = new Employee(); emp.setFirstName("John"); emp.setLastName("Doe"); emp.setBirthDate(LocalDate.parse("1965-01-01")); e.writeObject(emp); e.close(); } }

员工类代码:

package javaapplication15; import java.io.Serializable; import java.time.LocalDate; public class Employee implements Serializable { private String firstName; private String lastName; private LocalDate birthDate; public LocalDate employmentDate; public LocalDate getEmploymentDate() { return employmentDate; } public void setEmploymentDate(LocalDate employmentDate) { this.employmentDate = employmentDate; } public LocalDate getBirthDate() { return birthDate; } public void setBirthDate(LocalDate date) { birthDate = date; } public void setLastName(String lastName) { this.lastName = lastName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getFirstName() { return firstName; } public String getLastName() { return lastName; } }

推荐答案

以下修改代码解决了问题:

The following modification of the code solves the problem:

package javaapplication15; import java.beans.Encoder; import java.beans.Expression; import java.beans.PersistenceDelegate; import java.beans.XMLDecoder; import java.beans.XMLEncoder; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.time.LocalDate; /** * * @author hoshantm */ public class JavaApplication15 { /** * @param args the command line arguments */ public static void main(String[] args) throws FileNotFoundException, IOException { JavaApplication15 japp = new JavaApplication15(); japp.serializaData(); } public void serializaData() throws FileNotFoundException, IOException { XMLEncoder e = new XMLEncoder(new BufferedOutputStream( new FileOutputStream("d:\\temp\\Test.xml"))); Employee emp = new Employee(); emp.setFirstName("John"); emp.setLastName("Doe"); emp.setBirthDate(LocalDate.parse("1965-01-01")); e.setPersistenceDelegate(LocalDate.class, new PersistenceDelegate() { @Override protected Expression instantiate(Object localDate, Encoder encdr) { return new Expression(localDate, LocalDate.class, "parse", new Object[]{localDate.toString()}); } }); e.writeObject(emp); e.close(); XMLDecoder d = new XMLDecoder(new BufferedInputStream( new FileInputStream("d:\\temp\\Test.xml"))); Employee e2 = (Employee) d.readObject(); System.out.println(e2.getFirstName()); System.out.println(e2.getLastName()); System.out.println(e2.getBirthDate()); System.out.println(e2.getEmploymentDate()); } }

序列化数据如下所示:

<?xml version="1.0" encoding="UTF-8"?> <java version="1.8.0_92" class="java.beans.XMLDecoder"> <object class="javaapplication15.Employee"> <void property="birthDate"> <object class="java.time.LocalDate" method="parse"> <string>1965-01-01</string> </object> </void> <void property="firstName"> <string>John</string> </void> <void property="lastName"> <string>Doe</string> </void> </object> </java>

涉及单个LocalDate字段的替代实施:

Alternate implementation involving individual LocalDate fields:

package javaapplication15; import java.beans.Encoder; import java.beans.Expression; import java.beans.PersistenceDelegate; import java.beans.XMLDecoder; import java.beans.XMLEncoder; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.time.LocalDate; /** * * @author hoshantm */ public class JavaApplication15 { /** * @param args the command line arguments */ public static void main(String[] args) throws FileNotFoundException, IOException { JavaApplication15 japp = new JavaApplication15(); japp.serializaData(); } public void serializaData() throws FileNotFoundException, IOException { XMLEncoder e = new XMLEncoder(new BufferedOutputStream( new FileOutputStream("d:\\temp\\Test.xml"))); Employee emp = new Employee(); emp.setFirstName("John"); emp.setLastName("Doe"); emp.setBirthDate(LocalDate.parse("1965-01-01")); e.setPersistenceDelegate(LocalDate.class, new PersistenceDelegate() { @Override protected Expression instantiate(Object obj, Encoder encdr) { LocalDate localDate = (LocalDate) obj; return new Expression(localDate, LocalDate.class, "of", new Object[] {localDate.getYear(), localDate.getMonth(), localDate.getDayOfMonth()}); } }); e.writeObject(emp); e.close(); XMLDecoder d = new XMLDecoder(new BufferedInputStream( new FileInputStream("d:\\temp\\Test.xml"))); Employee e2 = (Employee) d.readObject(); System.out.println(e2.getFirstName()); System.out.println(e2.getLastName()); System.out.println(e2.getBirthDate()); System.out.println(e2.getEmploymentDate()); } }

序列化数据如下所示:

<?xml version="1.0" encoding="UTF-8"?> <java version="1.8.0_92" class="java.beans.XMLDecoder"> <object class="javaapplication15.Employee"> <void property="birthDate"> <object class="java.time.LocalDate" method="of"> <int>1965</int> <object class="java.lang.Enum" method="valueOf"> <class>java.time.Month</class> <string>JANUARY</string> </object> <int>1</int> </object> </void> <void property="firstName"> <string>John</string> </void> <void property="lastName"> <string>Doe</string> </void> </object> </java>

请注意,可以修改最后一个实现以包括其他字段,例如序列化中的小时和分钟LocalDateTime。

Note that the last implementation can be modified to include other fields such as hours and minutes in the serialization of LocalDateTime.

更多推荐

LocalDate序列化错误

本文发布于:2023-10-25 14:34:22,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1527236.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:错误   序列化   LocalDate

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!