我们有两个系统:外部和内部,它们以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: '????'}}}
我再也没有关于目录的所有信息......
所以,我请求帮助,如何在缺少数据的情况下正确构建算法来创建对象?
答案 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)
我要问的第一个问题是代码是否抛出异常?如果没有,则检查对象并将属性/对象设置为默认状态,因为如果没有发送数据,则无法检索数据。或者在对象的构造函数中,添加初始化代码,以便反序列化器具有可以使用的初始化对象。