LocalDate序列化错误 [英] LocalDate serialization error
本文介绍了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序列化错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文