目前,我必须存储一个类的对象,这个类不是实现Serializable,但肯定是SOAP序列化的,因为它是从WSDL生成的,并且是web服务的输入。
实际上,标准Java序列化会引发异常。我无法控制这些类,创建类的人员不愿意手工标记它们,因为代理是从Serializable自动生成的(wsdl2java?他们还没告诉我)。
因此,我需要把这个对象转换成其他的东西,不可能在每个字段上循环。
.class文件显示了XML序列化属性,因此我认为它们肯定是可序列化的。
如何对Java对象执行手动XML序列化?我可以在C#中做到这一点,但在Java中不行。
谢谢
发布于 2011-06-20 12:21:54
你能做到的
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 ;
}发布于 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
发布于 2011-06-20 12:25:03
如果您的对象遵循Java规范,并且不关心它们如何准确地表示为XML,那么来自Java的XMLEncoder就可以完成这项工作。
如果您的对象不是“纯”的JavaBeans,或者您需要对生成的XML进行更多的控制,那么XStream是一个流行的XML序列化库。
https://stackoverflow.com/questions/6410972
复制相似问题