Ролики и розетки

Я новичок в Castor и привязке данных в целом. Я работаю над приложением, которое частично должно извлекать данные из сокета и распаковывать данные для создания POJO. Теперь у меня есть сокеты, и я даже сгенерировал и скомпилировал java-файлы благодаря Ant и Castor.

Вот проблема: поток данных, который я получу, может быть одним из примерно 9 разных объектов. То есть я получаю поток текста (XML), который представляет объект с материалом, с которым я буду работать; опять же, в зависимости от типа объекта. Если бы это был всего один объект, все было бы просто: вызываю на нем команды unmarshall и иду своей веселой дорогой. Но, поскольку это может быть один из многих видов объектов, кто мне знает, что нужно рассортировать? Я читал про отображение, но либо не понял, либо это похоже на статическое отображение, а не на динамическое.

Любая помощь там?


person Dave    schedule 18.11.2009    source источник
comment
Никто? Это разочаровывает.   -  person Dave    schedule 20.11.2009
comment
Дело не в том, что мне не нравится ваш комментарий, просто он не отвечает на конкретную проблему. Я не хочу иметь один корневой элемент в моей схеме, а затем передавать один гигантский объект для каждого вызова метода.   -  person Dave    schedule 10.12.2009


Ответы (3)


Вы правы, Кастор ожидает статического отображения. Но с этим можно работать. Вы можете написать некоторый код, который изменит входящий xml, чтобы Castor на вашей стороне мог использовать одну схему, а на стороне ваших клиентов им не нужно было менять свои схемы.

Измените схему, которую Кастор ожидает получить, на что-то с общим корневым элементом, с вашими девятью различными альтернативами для ваших разных объектов (я думаю, вы можете ограничить ее, чтобы схема разрешала только одну из девяти, если это не не получается, вы можете просто сделать все подэлементы необязательными).

Затем вы можете написать код, который модифицирует входящий xml, чтобы обернуть входящий xml этим общим корневым элементом, а затем передать обернутый xml в поток, который считывается демаршаллером Castor.

Существует по крайней мере 3 различных способа реализации части xml-обертки: библиотеки SAX, XSLT и XML (например, JDOM, DOM4J и XOM — я предпочитаю XOM, но подойдет любой из них).

Способ SAX, вероятно, лучше всего подходит, если вы уже знакомы с SAX или если один из других способов работает, но не обеспечивает производительности. Если бы мне пришлось реализовать это, я бы создал XMLFilter, который принимает xml и записывает xml, накладывая его поверх другого фрагмента, который записывает xml в OutputStream, и пишет метод-оболочку вокруг неупорядочивающего материала, чтобы передать входящий поток в xmlreader, скопируйте OutputStream в другой InputStream (простой способ — использовать commons-io) и передайте новый InputStream демаршаллеру Castor.

С XSLT не получится обмануть SAX, хотя XSLT иногда имеет репутацию болезненного, мне кажется, что это может быть относительно прямолинейное преобразование, но я также не пробовал его. Прошло много времени с тех пор, как я использовал XSLT для чего-либо. Я также не уверен в производительности, хотя я бы не стал списывать это со счетов.

Использование XOM, JDOM или DOM4J для переноса XML также возможно, и кривая обучения намного ниже, чем для SAX или XSLT. Недостатком является то, что весь XML-документ имеет тенденцию всасываться в память сразу, поэтому, если вы имеете дело с достаточно большими документами, у вас может не хватить памяти.

person Nathan Hughes    schedule 24.11.2009

У меня есть аналогичная вещь в Jibx, где все объекты входящих сообщений реализуют базовый интерфейс, в котором есть поле, обозначающее тип сообщения.

Текст/xml сериализуется в базовый интерфейс, а затем я использовал шаблон команды для вызова соответствующей бизнес-логики в зависимости от типа сообщения, определенного в базовом интерфейсе.

Не уверен, что это возможно с помощью castor, но взгляните на Jibx, так как производительность просто фантастическая.

http://jibx.sourceforge.net/

person Karl    schedule 25.11.2009
comment
Мы используем castor для генерации источников для привязки данных. Я действительно не вижу никакой ценности в привязке данных к тому, что мы делаем, и если бы это зависело от меня, мы бы просто использовали XStream для сериализации/десериализации объектов. Я использовал его раньше и был очень доволен им. но, увы, процесс утверждения программного обеспечения не допускает новых инновационных вещей, таких как Jibx. На самом деле мы используем старую версию Castor по той же причине :\ - person Dave; 10.12.2009

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

person Dave    schedule 10.12.2009