java-Simpleframework.空值可以保留在集合中吗?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java-Simpleframework.空值可以保留在集合中吗?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3657字,纯文字阅读大概需要6分钟。
内容图文
我有一个对象-> XML->我必须支持的一个项目中的对象过程.
该对象包含List,并且如果将其序列化,则将省略list中存在的所有空值.
我的问题是,可以使用Simpleframework完成还是应该使用其他方法?什么?
这是我的工作:
import java.io.StringWriter;
import java.util.Arrays;
import java.util.List;
import org.simpleframework.xml.Attribute;
import org.simpleframework.xml.ElementList;
import org.simpleframework.xml.Root;
import org.simpleframework.xml.core.Persister;
import org.testng.annotations.Test;
public class SimpleframeworkTest {
@Test
public void testNullsInParams() throws Exception {
Container container = new Container();
container.setId(4000);
container.setParams(Arrays.asList(new Object[] { "foo", null, "bar" }));
String xml = container.toXml(); // omits null value in output
}
@Test
public void testDeserializeNull() throws Exception {
String xml = "<container id=\"4000\">"+
" <object class=\"java.lang.String\">foo</object>"+
// " <object class=\"java.lang.String\"></object>"+ // gets NullPointerException here
" <object class=\"java.lang.String\">bar</object>"+
"</container>";
Container object = Container.toObject(xml);
}
@Root(name = "container", strict = false)
public static class Container {
@Attribute
private Integer id;
@ElementList(inline = true, required = false)
private List<Object> params;
public String toXml() throws Exception {
StringWriter sw = new StringWriter();
new Persister().write(this, sw);
return sw.toString();
}
public static Container toObject(String xml) throws Exception {
return new Persister().read(Container.class, xml);
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public List<Object> getParams() {
return params;
}
public void setParams(List<Object> params) {
this.params = params;
}
@Override
public String toString() {
return "Container [id=" + id + ", params=" + params + "]";
}
}
}
解决方法:
首先,您的列表注释缺少条目名称:
@ElementList(inline = true, required = false, entry = "object")
private List<Object> params;
否则< string> …< / string>使用而不是< object> …< / object>.
您可以通过将type = String.class添加到列表的批注中来防止该空指针异常.但是,这不能解决主要问题.
通常,空标记/ null元素不会添加到结果中.
这是一个如何使用Converter解决此问题的示例.
public class SimpleframeworkTest
{
// ...
@Root(name = "container", strict = false)
@Convert(NullawareContainerConverter.class)
public static class Container
{
static final Serializer ser = new Persister(new AnnotationStrategy());
// ...
public String toXml() throws Exception
{
StringWriter sw = new StringWriter();
ser.write(this, sw);
return sw.toString();
}
public static Container toObject(String xml) throws Exception
{
return ser.read(Container.class, xml);
}
// ...
}
static class NullawareContainerConverter implements Converter<Container>
{
final Serializer ser = new Persister();
@Override
public Container read(InputNode node) throws Exception
{
final Container c = new Container();
c.id = Integer.valueOf(node.getAttribute("id").getValue());
c.params = new ArrayList<>();
InputNode n;
while( ( n = node.getNext("object")) != null )
{
/*
* If the value is null it's added too. You also can add some
* kind of null-replacement element here too.
*/
c.params.add(n.getValue());
}
return c;
}
@Override
public void write(OutputNode node, Container value) throws Exception
{
ser.write(value.id, node);
for( Object obj : value.params )
{
if( obj == null )
{
obj = ""; // Set a valid value if null
}
// Possible you have to tweak this by hand
ser.write(obj, node);
}
}
}
}
如评论中所写,您必须做一些进一步的工作.
结果:
testNullsInParams()
<container>
<integer>4000</integer>
<string>foo</string>
<string></string>
<string>bar</string>
</container>
testDeserializeNull()
Container [id=4000, params=[foo, null, bar]]
内容总结
以上是互联网集市为您收集整理的java-Simpleframework.空值可以保留在集合中吗?全部内容,希望文章能够帮你解决java-Simpleframework.空值可以保留在集合中吗?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。