2009-11-18 4 views
1

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

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

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

+0

Никто? Это разочаровывает. – Dave

+0

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

+0

Я не думаю, что вам придется пройти вокруг гигантского объекта. Вам нужно будет пройти через диаграмму unmarshalled object и найти то, что на самом деле получилось, и вернуть это. Рад слышать, что у вас есть решение. –

ответ

0

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

2

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

Измените схему, которую 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 в unmarshaller Castor.

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

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

1

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

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

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

http://jibx.sourceforge.net/

+0

Мы используем кастор для генерации источников привязки данных. Я действительно не вижу никакой ценности в привязке данных к тому, что мы делаем, и если бы это зависело от меня, мы бы просто использовали XStream для сериализации/десериализации объектов. Я использовал его раньше и был очень доволен этим. но, увы, процесс утверждения программного обеспечения не позволяет создавать новые инновационные вещи, такие как Jibx. Фактически, мы используем старую версию Castor по той же причине: \ – Dave