我正在与C ++服务器连接,所以我决定将我的对象解除/序列化为我通过套接字发送的XML字符串。
我无法使用自定义库,因为在服务器端,我无法安装大型库,因为空间相当有限,因此代码应该尽可能小。
到目前为止,我已经编写了第一个通过反射序列化我的对象的版本,这很容易做到。目前我只使用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>
现在我正在尝试实现反序列化,我面临的问题是将值从字符串中恢复为实际值。
对于原语和字符串类,这是微不足道的,但我想知道以后如何处理自定义类。
我在想,如果我谨慎地进入成员班,它应该归结为一直都是原始的,或者我错了吗?我以这样的方式设置序列化,即我可以recursevily序列化非原始或字符串的成员和子类。
我错过了什么或者我的理解是否正确?如果我这样做,我是否能够正确地对待复杂的课程?
目前我忽略了引用的问题,因为第一步是仅反序列化一个简单的类。
答案 0 :(得分:2)
您可以使用XMLEncoder / XMLDecoder,它是JDK的一部分。
检查:http://docs.oracle.com/javase/6/docs/api/java/beans/XMLEncoder.html
顺便说一句,你说你正在与c ++服务器连接,你如何在那里反序列化xml?有匹配的c ++类吗?似乎你正在重新发明一些跨语言的RPC /通信机制。您是否看过“Java RMI”或基于SOAP的Web服务?
答案 1 :(得分:2)
标准解决方案是JAXB,已part of Java SE since JDK 1.6。
特别是,它支持使用注释配置映射(或者您可以简单地依赖于合理的默认值),这比外部XML文件简单得多,并且可以从XML架构或架构派生映射类来自映射的类。它还可以根据XML Schema轻松验证文档。
此外,如果您正在使用的XML是SOAP Web服务,则JAX-WS构建在JAXB上以从WSDL(或来自带注释的接口的WSDL)创建接口,并且透明地为您处理编组和解组。