zinal: (Default)
Maksim Zinal ([personal profile] zinal) wrote2010-12-28 04:06 pm
Entry tags:

Мученикам XStream посвящается

Всем мученикам, пытающимся заставить XStream пропускать незнакомые (сиречь не скартированные) теги (вместо того, чтобы кидаться исключением, как оно это обычно делает), посвящается найденное мною решение этой странной проблемы.

При создании объекта XStream требуется переопределить его метод wrapMapper следующим образом:

      xs = new XStream() {
        @Override
        protected MapperWrapper wrapMapper(MapperWrapper next) {
          return new MapperWrapper(next) {
            @Override
            public boolean shouldSerializeMember(Class definedIn, String fieldName) {
              if ( definedIn==Object.class ) {
                // Незнакомый тег либо элемент неявной коллекции.
                boolean niceField = false;
                try {
                  // Для элементов неявной коллекции есть картирование на класс.
                  niceField = (realClass(fieldName) != null);
                } catch(CannotResolveClassException crce) {}
                if ( ! niceField )
                  log.warn("Пропуск неподдерживаемого блока XML: " + fieldName);
                return niceField;
              }
              return super.shouldSerializeMember(definedIn, fieldName);
            }
          };
        }
      };

Основное мучение было с поддержкой неявных коллекций, так как основную часть кода удалось содрать из тестов к тому же XStream.

So this way you can skip unknown tags, guys :)