java - 反序列化 Java 对象

标签 java algorithm

我正在与 C++ 服务器交互,所以我决定将我的对象反序列化/序列化为一个 XML 字符串,然后通过套接字发送。

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

到目前为止,我已经编写了第一个通过反射序列化我的对象的版本,这很容易做到。目前我只使用了intString,但是我想以此为基础进行后续的扩展,所以我希望尽可能把基础做好。

现在,当我序列化为 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>

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

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

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

我是不是遗漏了什么或者我的理解是否正确?如果我这样做,我是否也能够正确反序列化复杂类?

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

最佳答案

对此的标准解决方案是 JAXB , 这一直是 part of Java SE since JDK 1.6 .

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

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

关于java - 反序列化 Java 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17093422/

相关文章:

java - Java 中的快速排序实现

algorithm - 图中节点的最长递增序列

java - 在Java中解析CSV格式字符串

Java:一次在不同线程中绘制多个 Sprite

algorithm - 在大量文件中搜索固定字符串的静态列表

c++ - 如何使用任何排序算法在每次交换后打印到控制台?

algorithm - 从大型数据文件计算每个客户的总成本

java - 在 Java 中,如何在单线程程序中抛出 ConcurrentModificationException?

java GUI布局建议

java - 如何使用 jsvc 将 java 程序转换为守护进程?