LocalDate序列化错误 [英] LocalDate serialization error

查看:340
本文介绍了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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆