当前位置: 首页 > 知识库问答 >
问题:

序列化和反序列化Joda DateTime对象

公冶经纶
2023-03-14

我已经开始将一个项目从使用Java标准日期迁移到Joda DateTime。

我的项目使用XML序列化将对象保存到XML文件中。在这个特殊的例子中,我有一个Item类,它有一个DateTime属性。

在某个时候,我正在初始化对象,包括像这样的DateTime属性:

        Item item = new Item();
        item.setIdSearchCriteria(this.searchCriteria.getId());
        item.setUrl(fullUrl);
        item.setTitle(itemTitle);   
        item.setDateTime(new DateTime());

我使用XMLEncoder使用辅助类序列化项目:

public void saveDataList(List<Serializable> dataList) throws DAOGenericException 
{
    if(dataList == null)
        throw new IllegalArgumentException();

    checkDirectory();
    ArrayList<Serializable> writtenObject = (ArrayList<Serializable>) dataList;
    FileOutputStream os;
    try {

        // Save data as xml file
        os = new FileOutputStream(new File(fullFilename));
        XMLEncoder encoder = new XMLEncoder(os);
        encoder.writeObject(writtenObject);
        encoder.close();
    } catch (FileNotFoundException e) 
    {
        throw new DAOGenericException(e.getMessage(),e);
    }
}

显然,日期时间被保存在xml中。。。但毫无价值:

<?xml version="1.0" encoding="UTF-8"?>
<java version="1.7.0_21" class="java.beans.XMLDecoder">
 <object class="java.util.ArrayList">
  <void method="add">
   <object class="com.pikes.domain.Item">
    <void property="dateTime">
     <object class="org.joda.time.DateTime"/>
    </void>
    <void property="id">
     <int>1</int>
    </void>
    <void property="idSearchCriteria">
     <int>1</int>
    </void>
    <void property="title">
     <string>A title</string>
    </void>
    <void property="url">
     <string>http://www.random-url.com</string>
    </void>
   </object>
  </void>
 </object>
</java>

显然,它没有保存任何东西,但不,它只是保存“实际”日期时间。我的意思是,如果我在15:30将项目保存在XML文件中,然后在18:00加载XMLhtml" target="_blank">文件,那么日期显示。。。18:00!!

当然,这不是我所期待的行为。我希望在XML文件中保存毫秒数,因此每当我反序列化对象时,每次都会得到相同的日期时间。

我做错了什么?

我还尝试了以下方法,得到了同样的结果:

item.setDateTime(DateTime.now());
item.setDateTime(Instant.now().toDateTime());

提前谢谢你。

共有2个答案

乐修远
2023-03-14

我认为这是因为DateTime没有任何属性(即getXXX/setXXX),所以XMLEncoder不会找到任何要序列化的东西。

您可以用另一种处理序列化/反序列化的类型包装DateTime,例如这样的类型。。。

public class DateTimeHolder {
    private DateTime dateTime;

    // Use this to create one of these holders
    public static DateTimeHolder holderFor(DateTime dateTime) {
        DateTimeHolder h = new DateTimeHolder();
        h.dateTime = dateTime;
        return h;
    }

    // Use this to get the actual date time value
    public DateTime dateTime() {
        return dateTime;
    }


    // PROPERTIES...

    public String getTime() {
        // Format the date time as a string
    }

    public void setTime(String time) {
        // Parse the string into a date time and set the field
    }
}

如果希望对XML有更多的控制,最好使用更高级的框架,比如JAXB。(我以前从未真正使用过XMLEncoder…)

希望这有帮助

茹轩昂
2023-03-14

你需要创建一个java。豆。PersistenceDelegate实现Jodatime,并将其设置为java上相应类型的持久化委托。豆。XMLEncoder使用setPersistenceDelegate方法。

 类似资料:
  • 本文向大家介绍java对象的序列化和反序列化,包括了java对象的序列化和反序列化的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了java对象的序列化和反序列化,供大家参考,具体内容如下 1. 什么是序列化        将对象转换为字节流保存起来,比如保存到文件里,并在以后还原这个对象,这种机制叫做对象序列化。(补充一句:把对象保存到永久存储设备上称为持久化) 2. 怎么实现序列化

  • 问题内容: 我注意到存储在Redis中的某些序列化对象在反序列化方面遇到问题。 当我对Redis中存储的对象类进行更改时,通常会发生这种情况。 我想了解问题,以便为解决方案设计一个清晰的方案。 我的问题是,什么导致反序列化问题?移除公共/私人财产会引起问题吗?也许添加新属性?向类添加新功能会产生问题吗?那么更多的构造函数呢? 在我的序列化对象中,我有一个属性Map,如果我更改(更新了一些属性,添加

  • 问题内容: Golang中将结构序列化和反序列化为字符串的最佳方法(完整性和性能)是什么,反之亦然? 例如,如果我有这个结构: 我想将其存储在Redis上并取回。我试过保存,整型和字符串,这很好,但是如何存储结构对象? 问题答案: 使用gob和base64可以解决问题,例如: 当您需要序列化自定义结构或类型(例如struct)时,只需添加以下行:

  • 主要内容:1 Java序列化和反序列化,2 Java序列化的优点,3 java.io.Serializable接口,4 Java ObjectOutputStream,5 Java ObjectInputStream,6 Java序列化的例子,7 Java反序列化的例子1 Java序列化和反序列化 Java中的序列化是一种将对象状态写入字节流的机制。它主要用于Hibernate,RMI,JPA,EJB和JMS技术。 序列化的反向操作称为反序列化,其中字节流被转换为对象。序列化和反序列化过程与平台

  • 本文向大家介绍详解Java 对象序列化和反序列化,包括了详解Java 对象序列化和反序列化的使用技巧和注意事项,需要的朋友参考一下 之前的文章中我们介绍过有关字节流字符流的使用,当时我们对于将一个对象输出到流中的操作,使用DataOutputStream流将该对象中的每个属性值逐个输出到流中,读出时相反。在我们看来这种行为实在是繁琐,尤其是在这个对象中属性值很多的时候。基于此,Java中对象的序列