我一直在面对这个问题,序列化上的hibernate对象产生了包含来自Hibernate的所有检测代码的意外xmls.
在序列化对象之前,我们对对象进行了一些清理.
但是,是否有可用于直接序列化对象的标准选项?
是否有Java XStream包的YAML驱动程序?
我已经在使用XStream来序列化/反序列化XML和JSON.我希望能够对YAML做同样的事情.
我正在使用类似于此的XML有效负载(有关更全面的示例,请查看:http://api.shopify.com/product.html).
<products type="array">
<product>
...
</product>
<product>
...
</product>
</products>
Run Code Online (Sandbox Code Playgroud)
现在我的代码确实有效,但它做的事情似乎真的"错误" - 即它将"产品"与List.class相关联.所以相关代码如下所示:
xstream.alias( "products", List.class );
xstream.alias( "product", ShopifyProduct.class );
Run Code Online (Sandbox Code Playgroud)
这很好,除非我转到使用该xstream实例外部化任何对象时,它总是使用"产品",这不是我想要的.
我想要能够将通用集合映射到标签:
xstream.alias( "products", ( List<ShopifyProduct> ).class ); // way too easy
Run Code Online (Sandbox Code Playgroud)
或者让以下snipet工作,但目前还没有:
ClassAliasingMapper mapper = new ClassAliasingMapper( xstream.getMapper( ) );
mapper.addClassAlias( "product", ShopifyProduct.class );
xstream.registerLocalConverter( ShopifyProductResponse.class, "products", new CollectionConverter( mapper ) );
Run Code Online (Sandbox Code Playgroud)
我创建了ShopifyProductResponse类来尝试包装ShopifyProduct,但它没有任何告诉我:
com.thoughtworks.xstream.mapper.CannotResolveClassException:products:com.thoughtworks.xstream.mapper.DefaultMapper.realClass(DefaultMapper.java:68)中的产品,位于com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38) )
如果我添加:
xstream.alias( "products", List.class );
Run Code Online (Sandbox Code Playgroud)
然后它消失了...所以在我看来mapperwrapper没有抓住这里 - 可能是因为它寻找ShopifyProductResponse对象并找到一个List而不是 - 我真的不知道.
如果我们使用Spring MVC开发REST,它将支持XML和JSON数据.我在spring config bean中编写了ContentNegotiationViewResorverapp-servlet.xml
<bean
class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver"
p:order="1">
<property name="mediaTypes">
<map>
<entry key="xml" value="application/xml" />
<entry key="json" value="application/json" />
</map>
</property>
<property name="defaultViews">
<list>
<bean class="org.springframework.web.servlet.view.xml.MarshallingView">
<property name="marshaller">
<bean class="org.springframework.oxm.xstream.XStreamMarshaller"
p:autodetectAnnotations="true" />
</property>
</bean>
<bean
class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" />
</list>
</property>
</bean>
Run Code Online (Sandbox Code Playgroud)
我的Spring REST控制器是:
@Controller
@RequestMapping("/rest/customers")
class CustomerRestController {
protected Log log = LogFactory.getLog(CustomerRestController.class);
@RequestMapping(method = POST)
@ResponseStatus(CREATED)
public void createCustomer(@RequestBody Customer customer,
HttpServletResponse response) {
log.info(">>>" + customer.getName());
response.setHeader("Location", String.format("/rest/customers/%s",
customer.getNumber()));
}
@RequestMapping(value = "/{id}", method = GET)
@ResponseBody
public Customer …Run Code Online (Sandbox Code Playgroud) 我在Java中使用xStream来从java库中序列化java对象并在客户端对其进行反序列化.
我有几个问题:
如果我这样做:
XStream xstream = new XStream();
xstream.setMode(XStream.ID_REFERENCES);
xstream.autodetectAnnotations(true);
Writer writer = new FileWriter(xmlFile);
writer.write(xstream.toXML(myObject));
writer.close();
Run Code Online (Sandbox Code Playgroud)
=>序列化没问题,但反序列化: Exception in thread "main" com.thoughtworks.xstream.io.StreamException: : only whitespace content allowed before start tag and not . (position: START_DOCUMENT seen .... @1:1)
如果我这样做:
XStream xstream = new XStream();
xstream.setMode(XStream.NO_REFERENCES);
xstream.autodetectAnnotations(true);
Writer writer = new FileWriter(xmlFile);
writer.write(xstream.toXML(myObject));
writer.close();
Run Code Online (Sandbox Code Playgroud)
=>我遇到了序列化问题: Exception in thread "main" com.thoughtworks.xstream.io.StreamException: : only whitespace content allowed before start tag and not . (position: START_DOCUMENT seen .... @1:1)
at com.thoughtworks.xstream.io.xml.XppReader.pullNextEvent(XppReader.java:78)
at com.thoughtworks.xstream.io.xml.AbstractPullReader.readRealEvent(AbstractPullReader.java:137) …
我有以下XML:
<patient>
<name>Mr. Sick</name>
<report>
<paragraph><bold>Conclusion</bold>text...</paragraph>
</report>
</patient>
Run Code Online (Sandbox Code Playgroud)
我想将此转换为类患者的实例,如下所示:
Class Patient {
String name = "Mr. Sick";
String report = "<paragraph><bold>Conclusion</bold>text...</paragraph>";
}
Run Code Online (Sandbox Code Playgroud)
是否可以使用XStream仅转换部分XML并将报告字段保留为XML格式?怎么做到呢?
我有一些xml代码,我想解析这个java对象请帮助我.
<Error>
<number>1020</number>
<Type>fatal</Type>
<Text>Nagaraju</Text>
<Text>Suresh</Text>
<Text>Sound</Text>
<Text>Rajesh</Text>
</Error>
Run Code Online (Sandbox Code Playgroud)
java对象是
Class Error{
int number;
String type;
List<String>texts=new ArrayList<String>();
}
Run Code Online (Sandbox Code Playgroud) 我正在增强一个客户,这是一个更大的项目的一部分.由于速度不足,我被迫切换到CNI,因此我必须使用GNU-gcj编译器生成本机代码(gnu 4.6.3).
编译和链接工作正常(感谢-findirect-dispatch标志),我没有任何问题执行输出.但是当涉及到客户端和服务器之间的通信时,客户端会立即断开连接.原因:
[XStreamClient Reader] WARN - 客户端断开连接(例外:com.thoughtworks.xstream.io.StreamException:无法创建XmlPullParser)
(此Exeption仅出现在客户端的gcj编译版本中.当我使用java解释器运行代码时 - 事情运行良好(但速度太慢^^)) - >具有挑战性的部分是我无法检索源代码发生此异常的代码,因为它位于客户端使用的预编译(Java类文件)库中.(我无法联系该图书馆的作者)
我想这个库会调用XppReader然后尝试创建一个XmlPullParser类并失败.
我通过解压缩它们并编译创建的*.class文件然后链接目标文件来绑定XStream(vers.1.4.3)库(以及其他所需的*.jars).这似乎也适用于所有其他图书馆.(我的操作系统= Ubuntu)
我已经做了什么来克服这个问题:我搜索了XStream/XmlPullParser和gcj,并用不同的版本替换了"xmlpull" - 和"kxml2"文件.但没有任何效果.你们中的任何人都知道可能是什么解决方案吗?
我发现XmlPullParser创建失败的原因是XmlPullParserFactory.newInstance函数无法找到带有/services/org.xmlpull.v1.XmlPullParserFactory文件的META-INF目录.这是因为我只编译并链接了*.jar的*.class文件.因此,只要我找到了将META-INF目录链接到该函数可以找到并访问它的可执行文件的方法,就应该解决问题.你们中的任何人都知道这样做的方法吗?
对于本地转换器,当编组到XML时,有没有办法访问父对象?
我需要使用来自第三方源的项目对集合进行编组 - 使用存储在父对象中的id.
唉,似乎无法查询通向当前对象的对象路径.还是有吗?
警告:发生了非法的反射访问操作警告:com.thoughtworks.xstream.core.util.Fields(文件:libraries / xstream-1.4.10.jar)对字段java.util.TreeMap.comparator的非法反射访问