Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
反序列化Java对象 我与一个C++服务器接口,所以我决定将我的对象分解成序列化到我在Socket上发送的XML字符串。_Java_Algorithm - Fatal编程技术网

反序列化Java对象 我与一个C++服务器接口,所以我决定将我的对象分解成序列化到我在Socket上发送的XML字符串。

反序列化Java对象 我与一个C++服务器接口,所以我决定将我的对象分解成序列化到我在Socket上发送的XML字符串。,java,algorithm,Java,Algorithm,我不能使用自定义库,因为在服务器端,我不能安装大型库,因为空间相当有限,所以代码应该尽可能小 到目前为止,我已经编写了通过反射序列化对象的第一个版本,这很容易做到。目前我只使用了代码> int 和String ,但是我想用这个作为以后扩展的基础,所以我希望尽可能地把这个基础弄清楚。 现在,当我序列化为XML时,值当然是字符串表示形式(下面是它的外观示例): 现在,我正在尝试实现去序列化,我面临着将值从字符串返回到实际值的问题 对于原语和字符串类来说,这很简单,但我想知道以后如何处理自定义类

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

到目前为止,我已经编写了通过反射序列化对象的第一个版本,这很容易做到。目前我只使用了代码> int 和String ,但是我想用这个作为以后扩展的基础,所以我希望尽可能地把这个基础弄清楚。 现在,当我序列化为XML时,值当然是字符串表示形式(下面是它的外观示例):


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

对于原语和字符串类来说,这很简单,但我想知道以后如何处理自定义类

我在想,如果我递归进入成员类,它应该一直归结为primitve,或者我错了吗?我将序列化设置为可以递归序列化非原语或字符串的成员和子类

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


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

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

检查:


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

解决这一问题的标准解决方案是,它已经过了

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


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

您的程序必须用XML反序列化吗?如果没有,那么其他格式(如JSON)可能是更好的选择,因为它使序列化和反序列化更容易。我选择XML,因为它已经在我们的服务器系统上,因此它是一个外部库,我可以实际使用,而无需将它放在本地空间中。我还想获得XML方面的经验,因为我们在其他项目中大量使用XML,所以这是我的自然选择。我知道这很痛苦,但我正在研究JAXB,为此我必须另外安装许多工具,所以这不是我可以使用的工具(我会看看这个
RMI
SOAP
是什么,因为我以前没有找到。刚刚测试过,XMLEncoder看起来非常适合我的需要。谢谢!是的,我知道JAXB,但它需要额外的工具来安装,我必须避免。什么“工具”?它是任何最近的JDK的一部分,如果没有它,您如何开发Java?我必须安装这个额外的编译器来生成类,对吗?使用xjc.exe是可选的,并且由于它是过去几年中发布的每个JDK的一部分(例如,jdk1.6.0_02\bin\xjc.exe),很可能已经安装了…我在谷歌上搜索了很多关于JAXB的教程,它们对我来说都很复杂,因为我不想处理XSD。最后我在这里找到了一个简单的()这正是我想要的。在做了一些测试之后,我发现,对于让我开始学习的简单案例,代码没有比使用XMLEncoder更复杂,没有我注意到的缺点,所以我决定使用JAXB。谢谢!
<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>