2016-12-29 76 views
1

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

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

Main类代码:

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();   
    } 
} 

Employee类代码:

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; 
    } 
} 
+0

我希望这可以帮助http://stackoverflow.com/questions/8166368/why-doesnt-javabeans-serialize-a-property-from-type-list – xFighter

+0

@xFighter感谢您的帮助。请注意,LocalDate实现了Serializable。请参阅https://docs.oracle.com/javase/8/docs/api/java/time/LocalDate.html。不过,我找到了一个我现在要发布的解决方案。 – Tarik

+0

我注意到LocalDate也实现了Serializable – xFighter

回答

1

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

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的领域:

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> 

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