当前位置: 首页 > 面试题库 >

简单框架。空值可以保留在集合中吗?

曹理
2023-03-14
问题内容

我必须支持的一个项目中有一个对象->
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]]


 类似资料:
  • 集合框架的综合应用 代码示例:模拟斗地主洗牌和发牌 package cn.itcast_04; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.TreeSet; /* * 思路: * A:创建一个HashMap集合 *

  • 一、Java集合类简介: Java集合大致可以分为Set、List、Queue和Map四种体系。 其中Set代表无序、不可重复的集合;List代表有序、重复的集合;而Map则代表具有映射关系的集合。Java 5 又增加了Queue体系集合,代表一种队列集合实现。 Java集合就像一种容器,可以把多个对象(实际上是对象的引用,但习惯上都称对象)“丢进”该容器中。从Java 5 增加了泛型以后,Jav

  • 实现一个最最简单的数学计算:加、减、乘、除,给大家演示如何搭建简单的 API Server。按照前面几章的写法,先来看看加法、减法示例代码: worker_processes 1; #nginx worker 数量 error_log logs/error.log; #指定错误日志文件路径 events { worker_connections 1024; } http

  • 问题内容: 我有一个gridview,其中包含一个复选框列,也使用分页。当我在第一页中选中某些复选框并导航到第二页并在第二页中选中另一个复选框时,我在第一页中选中的选项不会保留在那里。分页期间可以保留复选框的值吗? Gridview的代码是 编辑: 用于记住gridview中所选选项的扩展,请检查此链接Selgridview 感谢 bool.dev 问题答案: 您可以使用会话/ cookie来存储

  • 我有一个选择框。有4个值(使用jstl标记生成),并且有加载按钮。 我正在单击load按钮调用struts操作 在struts操作类中,我添加了 现在我想在jsp页面中保留以前选择的值 我想与进行比较,而不是与Cloud进行比较。如何使用jstl(例如: 提前致谢

  • 第6章 集合框架 Collection接口 List接口 Set接口 Queue接口 集合的遍历 集合工具类 Map接口 Predicate和Stream操作集合 集合框架的综合应用 Java集合类型详解 LinkedList源码剖析 LinkedHashMap源码剖析 HashMap、哈希表、哈希函数 HashMap的实现原理 HashMap源码剖析