首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >手动XML-序列化Java对象

手动XML-序列化Java对象
EN

Stack Overflow用户
提问于 2011-06-20 12:16:27
回答 3查看 2.8K关注 0票数 0

目前,我必须存储一个类的对象,这个类不是实现Serializable,但肯定是SOAP序列化的,因为它是从WSDL生成的,并且是web服务的输入。

实际上,标准Java序列化会引发异常。我无法控制这些类,创建类的人员不愿意手工标记它们,因为代理是从Serializable自动生成的(wsdl2java?他们还没告诉我)。

因此,我需要把这个对象转换成其他的东西,不可能在每个字段上循环。

.class文件显示了XML序列化属性,因此我认为它们肯定是可序列化的。

如何对Java对象执行手动XML序列化?我可以在C#中做到这一点,但在Java中不行。

谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-06-20 12:21:54

你能做到的

代码语言:javascript
复制
 private byte[] encode(YourObject obj)
    {
        byte[] bytes = null;
        try
        {
            YourObject vsNew = new YourObject(obj)
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
                GZIPOutputStream out = new GZIPOutputStream(baos);
                XMLEncoder encoder = new XMLEncoder(out);
                encoder.writeObject(vsNew);
                encoder.close();
                bytes = baos.toByteArray();
        }
        catch (Exception e)
        {
            _log.error("Exception caught while encoding/zipping ", e);
        }
        return bytes;
    }


    /*
     * Decode the report definition blob back to the
     * ScheduledReport object.
     */
    private YourObject decode(byte[] bytes)
    {
        ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
        YourObject vSNew = null;
        try
        {
            GZIPInputStream in = new GZIPInputStream(bais);
            XMLDecoder decoder = new XMLDecoder(in);
            vSNew = (YourObject)decoder.readObject();
            decoder.close();
        }
        catch (Exception e)
        {
            _log.error("IOException caught while decoding/unzipping ", e);
        }
        return vSNew ;
    }
票数 1
EN

Stack Overflow用户

发布于 2011-06-20 16:52:04

这是一种做事的方式,另一种方法是让the....people控制java客户机更合理一些。假设Jax-ws被用来通过wsimport实用程序创建客户机,他们可以指定一个简单的小绑定文件,在-b选项中指定,如下所示:

<?xml version="1.0" encoding="UTF-8"?>

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema

xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"

xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"

elementFormDefault="qualified" attributeFormDefault="unqualified"

jaxb:extensionBindingPrefixes="xjc" jaxb:version="2.1">

<xs:annotation>

<xs:appinfo>

<jaxb:globalBindings>

<xjc:serializable />

</jaxb:globalBindings>

</xs:appinfo>

</xs:annotation>

</xs:schema>

它将自动地将“可序列化”放到所有生成的类上。我还通过jaxws- Maven -plugin在maven中实现了这个功能。我相信其他客户端生成器也有类似的选择。

HTH

票数 1
EN

Stack Overflow用户

发布于 2011-06-20 12:25:03

如果您的对象遵循Java规范,并且不关心它们如何准确地表示为XML,那么来自Java的XMLEncoder就可以完成这项工作。

如果您的对象不是“纯”的JavaBeans,或者您需要对生成的XML进行更多的控制,那么XStream是一个流行的XML序列化库。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6410972

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档