如果没有某个日期,如何反序列化?

时间:2011-06-05 14:05:31

标签: java class object deserialization

我们有两个系统:外部和内部,它们以JSON格式共享信息(GSON库)。

来自外部系统的信息来自内部并在此处理。

一切都非常好,来自内部系统数据中的JSON格式的外部系统数据反序列化和处理。例如:

来串:

{UserLogInEvent:{userName:'Name', time:'00.00.00'}}

此字符串在此类的对象中反序列化:

UserLogInEvent implement Event {

private  String userName;
private Date time;

public UserLogInEvent (String userName, Date time)
{
this.userName = userName;
this.time = time;
}

private UserLogInEvent()
{
this.userName = null;
this.time = null;
}

public String getUserName()
{
return this.userName;
}
public Date time()
{
return this.time;
}
}

或其他例子:

{UserModifyFile: {userName:'Name',fileName: 'index.txt' time:'00.00.00'}}



UserModifyEvent implement Event {

private  String userName;
private String fileName;
private Date time;

public UserLogInEvent (String userName, String fileName, Date time)
{
this.userName = userName;
this.fileName = fileName;
this.time = time;
}

private UserLogInEvent()
{
this.userName = null;
this.fileName = null;
this.time = null;
}

public String getUserName()
{
return this.userName;
}
public Date time()
{
return this.time;
}
public String getFileName ()
{
return this.fileName;
}
}

算法非常简单:

string -> deserialization -> object events created.
但是......进一步的问题开始了。我无法决定这些问题..

添加了新活动。

外部系统附带的信息不包含有关该事件的所有必要数据,例如:

{UpdateProductInfoEvent: {userName:'name', time: '00.00.00', product: {id:'123', name: '???', type: '???', cost:'???'}}}

正如您所看到的,该行不包含所有数据...只是反序列化不会产生所需的结果...

为此,我仍然需要调用一种方法,该方法将通过其ID接收有关产品的信息。

算法如下:

JSON string -> processing line -> product information from ID -> object creation * Event.

以下示例:

{ModifyProductCatalogEvent:{userName: 'Name', time: '00.00.00', catalog:{id:'321', catalogType:'???', catalogName: '????'}}}

我再也没有关于目录的所有信息......

所以,我请求帮助,如何在缺少数据的情况下正确构建算法来创建对象?

2 个答案:

答案 0 :(得分:1)

您可以通过覆盖编写自己的序列化和反序列化方法:

 private void writeObject(java.io.ObjectOutputStream out)
     throws IOException
 private void readObject(java.io.ObjectInputStream in)
     throws IOException, ClassNotFoundException;

使您可以自己处理这些案例。您仍然可以使用out.defaultWriteObject / in.defaultReadObject来使用默认方法,只需处理数据可能丢失的情况(或者如果您有无效对象的默认值,请使用常规方法读取所有字段,然后覆盖带有正确数据的无效字段。)

答案 1 :(得分:0)

我要问的第一个问题是代码是否抛出异常?如果没有,则检查对象并将属性/对象设置为默认状态,因为如果没有发送数据,则无法检索数据。或者在对象的构造函数中,添加初始化代码,以便反序列化器具有可以使用的初始化对象。