3

我正在与 C++ 服务器交互,因此我决定将我的对象反序列化为我通过套接字发送的 XML 字符串。

我不能使用自定义库,因为在服务器端,我不能安装大库,因为空间相当有限,所以代码应该尽可能小。

到目前为止,我已经编写了通过反射序列化我的对象的第一个版本,这很容易做到。目前我只使用intand 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>

现在我正在尝试实现反序列化,我面临着将值从字符串取回实际值的问题。

对于原语和字符串类,这是微不足道的,但我想知道以后如何处理自定义类。

我在想,如果我递归地进入成员类,它应该一直归结为原始,还是我错了?我以这样一种方式设置序列化,即我可以递归地序列化非原始或字符串的成员和子类。

我错过了什么还是我的理解正确?如果我这样做,我是否能够正确地反序列化复杂的类?

目前我忽略了引用的问题,因为第一步是反序列化一个直接的、简单的类。

4

2 回答 2

2

您可以使用 XMLEncoder/XMLDecoder,它是 JDK 的一部分。

检查:http ://docs.oracle.com/javase/6/docs/api/java/beans/XMLEncoder.html

顺便说一句,您说您正在与 C++ 服务器交互,您如何反序列化那里的 xml?有匹配的 c++ 类吗?

似乎您正在重新发明一些跨语言 RPC/通信机制。您是否看过“Java RMI”或基于 SOAP 的 Web 服务?

于 2013-06-13T17:42:06.973 回答
2

对此的标准解决方案是JAXB,它从 JDK 1.6 开始就成为 Java SE 的一部分

特别是,它支持使用注解配置映射(或者您可以简单地依赖合理的默认值),这远没有外部 XML 文件冗长,并且可以从 XML Schema 派生映射类,或从映射的 Schema类。它还可以根据 XML 模式轻松验证文档。

此外,如果您使用的 XML 是 SOAP Web 服务,则 JAX-WS 构建在 JAXB 之上以从 WSDL(或从注释接口创建 WSDL)创建接口,并透明地为您处理编组和解组。

于 2013-06-13T18:08:49.640 回答