2013-06-13 4 views
3

Я взаимодействую с сервером C++, поэтому решил де-/сериализовать свои объекты в XML-строку, которую я отправляю через сокет.Deserializing Java-объект

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

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

Теперь, когда я сериализации в XML значения, конечно, в строковом представлении (здесь пример того, как он выглядит):

<serializable classname="client.ServerTask"> 
    <member classname="int" isnull="false" name="mTaskId" primitive="true"> 
     <value> 
      <![CDATA[35]]> 
     </value> 
    </member> 
    <member classname="java.lang.String" isnull="false" name="mName" primitive="false"> 
     <value> 
      <![CDATA[TestServer]]> 
     </value> 
    </member> 
    <member classname="int" isnull="false" name="mPID" primitive="true"> 
     <value> 
      <![CDATA[512]]> 
     </value> 
    </member> 
    <member classname="int" isnull="false" name="mStatus" primitive="true"> 
     <value> 
      <![CDATA[32768]]> 
     </value> 
    </member> 
</serializable> 

Теперь я пытаюсь реализовать desrialization и я сталкиваясь с проблемой возврата значений из строки в фактические значения.

Для примитивов и класса строк это тривиально, но мне интересно, что делать с пользовательскими классами позже.

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

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

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

+0

Ваша программа должна десериализоваться в XML? Если нет, то другой формат, такой как JSON, может быть лучшим выбором, поскольку он упрощает сериализацию и десериализацию. – keelar

+0

Я выбрал XML, потому что он уже находится на нашей серверной системе и поэтому является одной из внешних библиотек, которые я могу использовать, не помещая их в свое местное пространство.Также я хотел получить опыт работы с XML, поскольку мы используем это довольно много в других проектах, поэтому для меня это был естественный выбор. – Devolus

ответ

2

Стандартным решением является JAXB, который был part of Java SE since JDK 1.6.

В частности, он поддерживает настройку сопоставления с аннотациями (или вы можете просто полагаться на разумные значения по умолчанию), который гораздо менее подробный, чем внешний XML-файл, и может выводить сопоставленные классы из схемы XML или Схема из сопоставленных классов. Он также может легко проверять документы в соответствии с XML-схемой.

Кроме того, если XML, который вы используете, является веб-сервисом SOAP, JAX-WS строит на JAXB для создания интерфейсов из WSDL (или WSDL из аннотированного интерфейса) и прозрачно обрабатывает маршаллинг и unmarshalling для вас.

+0

Да, я знаю о JAXB, но это требует дополнительных инструментов для установки, и этого я должен избегать. – Devolus

+0

Какие «инструменты»? Это часть любого недавнего JDK, как вы разрабатываете Java без одного? – meriton

+0

AFAIK Мне нужно установить этот дополнительный компилятор для создания классов, не так ли? – Devolus

2

Вы можете использовать XMLEncoder/XMLDecoder, это часть JDK.

Проверил: http://docs.oracle.com/javase/6/docs/api/java/beans/XMLEncoder.html

Кстати, вы сказали, вы взаимодействия с сервером C++, как вы де-сериализации XML там? Совместимы ли классы C++?

Кажется, что вы изобретаете механизм RPC/обмена несколькими языками. Посмотрел ли вы на «Java RMI» или на веб-службу на основе SOAP?

+0

В настоящее время я делаю это вручную на стороне сервера. Я знаю, что это боль, но я смотрел на JAXB, и я должен установить для него еще несколько инструментов, поэтому я не могу это использовать. :(Я буду смотреть, что это за «RMI» и «SOAP», так как я не нашел этого раньше. – Devolus

+0

Просто протестировал его, и XMLEncoder отлично подходит для моих нужд. Спасибо! – Devolus