Как десериализовать, если не хватает какой-то даты? - PullRequest
1 голос
/ 05 июня 2011

У нас есть две системы: внешняя и внутренняя, которые обмениваются информацией в формате 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:'???'}}}

Как видите, строка не содержит все данные ... просто десериализована не дает желаемого результата ...

Для этого мне все равно нужно вызвать метод, который будет получать информациюо товаре по его идентификатору.

Алгоритм следующий:

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

Следующий пример:

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

Опять же у меня нет всей информации о каталоге...

Итак, я прошу помощи, как правильно построить алгоритм создания объектов в случае отсутствия данных?

Ответы [ 2 ]

1 голос
/ 05 июня 2011

Вы можете написать свои собственные методы сериализации и десериализации, переписав:

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

, что позволяет вам самостоятельно обрабатывать эти случаи. Вы по-прежнему можете использовать методы по умолчанию, используя out.defaultWriteObject / in.defaultReadObject, чтобы обрабатывать только те случаи, когда данные могут отсутствовать (или если у вас есть значения по умолчанию для недопустимых объектов, прочитайте все поля обычными методами, а затем перезапишите недопустимые поля с правильными данными).

0 голосов
/ 05 июня 2011

Первый вопрос, который я хотел бы задать, заключается в том, генерирует ли код исключения? Если нет, то проверьте объект и установите свойства / объекты в состояние по умолчанию, поскольку нет способа извлечь данные, если они не отправили их. Или в конструкторе объектов добавьте код инициализации, чтобы десериализатор имел инициализированный объект для работы.

...