Как правильно десериализовать объекты при обнаружении ошибок - PullRequest
2 голосов
/ 28 июня 2010

У меня есть класс DataFile , который является классом верхнего уровня, который я сериализую. DataFile содержит ArrayCollection , который, в свою очередь, содержит объекты, расширяющие ArrayData , каждый из которых по-разному переопределяет readExternal .

В процессе разработки объект ArrayData версии 1.0 теперь отличается от объекта ArrayData в версии 1.1.

Это приводит к сбою десериализации, чаще всего с ошибкой нулевого объекта.

Это ожидаемое поведение. Я бы хотел, чтобы в случае возникновения ошибки объект просто игнорировался, и мы продолжали десериализацию.

Для этого я бросил логику try..catch в десериализацию для ArrayData

override public function readExternal(input:IDataInput):void {
  try {
    testvalue = input.readObject();
    newTestValue = input.readObject(); //a value that is not a part of the file being deserialized
  catch(e:Error){
    //an error occurred, but just keep going
  }
} 

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

Проблема, с которой я столкнулся сейчас, заключается в том, что сериализация ArrayCollection завершается неудачно сразу после того, как ошибка обнаружена в плохом ArrayData объекте с ошибкой индекса вне границ.

Ошибка № 2006: указанный индекс отсутствует границ.

Я пытался подделать данные в части catch объекта * ArrayData , но ничего не работает. Я не знаю, почему ошибка перепутывает цепочку десериализации, и я не знаю, как это предотвратить.

Если у кого-нибудь есть идеи о том, куда мне идти дальше в попытке решить эту проблему, я был бы признателен за отзыв.

Спасибо, Dan

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...