4

我有一个数组列表

List<?> myList=new ArrayList();

myList = fetchQuery(); //fetches the list of Entities

现在 myList 有一个实体列表

现在我将该列表转换为字符串,所以它现在是一个字符串对象。

String temp=myList.toString();

我的问题是如何将该临时字符串再次转换为该 myList(List of entity) ???

有任何想法吗??

我的温度值看起来像这样

temp="[entityObject1,entityObject2.......]" ..

我无法提取每个对象并使用该实体类对其进行投射。有没有办法?

谢谢..

4

4 回答 4

2

我已经做了一个示例程序来进行这种转换。你必须小心的事情。1.我们将使用其列表的类应该有一个重写的 toString 方法。(您可以有自己的 toString() 格式,但需要相应地更改其余的实现)。

具有覆盖 toString() 方法的示例内容对象类。

class Sample {

    private String name;
    private String sex;

    @Override
    public String toString() {
        return "name=" + name + "&" + "sex=" + sex;
    }
    /**
     * @param name
     *            the name to set
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * @param sex
     *            the sex to set
     */
    public void setSex(String sex) {
        this.sex = sex;
    }

}

主应用程序.java

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

public class MainApplication {

    public static void main(String[] args) {
        List<Sample> e = new ArrayList<Sample>();
        Sample a1 = new Sample();
        a1.setName("foo1");
        a1.setSex("Male");

        Sample a2 = new Sample();
        a2.setName("foo2");
        a2.setSex("Male");
        e.add(a1);
        e.add(a2);

        String tmpString=e.toString();
        List<Sample> sampleList = (List<Sample>) chengeToObjectList(tmpString, Sample.class);
    }

    /**
     * Method to change String to List<Obj>.
     * @param listString
     * @param contentClass
     * @return List of Objects
     */
    public static Collection chengeToObjectList(String listString, Class contentClass) {

        Collection returnList = new ArrayList();

        // Code to remove [ and ] coming from the toString method
        if (listString.charAt(0) == '[') {
            listString = listString.substring(1);
        }
        if (listString.charAt(listString.length() - 1) == ']') {
            listString = listString.substring(0, listString.length() - 1);
        }

        String[] stringArray = listString.trim().split(",");
        for (int i = 0; i < stringArray.length; i++) {
            String[] contentArray = stringArray[i].trim().split("&");
            Object ob = null;
            try {
                ob = contentClass.newInstance();
            } catch (InstantiationException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            } catch (IllegalAccessException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
            for (int j = 0; j < contentArray.length; j++) {

                String[] keyValueArray = contentArray[j].trim().split("=");

                String fieldName = keyValueArray[0].trim();
                //Code to make the 1st char uppercase
                String s = String.valueOf(fieldName.toCharArray()[0]);
                s = s.toUpperCase();
                fieldName = s + fieldName.substring(1);

                String fieldValue = keyValueArray[1].trim();

                Class[] paramTypes = new Class[1];
                paramTypes[0] = String.class;
                String methodName = "set" + fieldName; 
                Method m = null;
                try {
                    m = contentClass.getMethod(methodName, paramTypes);
                } catch (NoSuchMethodException m) {
                    m.printStackTrace();
                }
                try {
                    String result = (String) m.invoke(ob, fieldValue);
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                } catch (InvocationTargetException e1) {
                    e1.printStackTrace();
                }
            }
            returnList.add(ob);
        }

        return returnList;
    }
}
于 2012-06-13T14:12:58.553 回答
0

当你做 myList.toString(); 您实际上调用了AbstractCollection.toString()方法,该方法又调用了 List 中每个对象的 toString() 方法。

除非 Entity 类的 toString() 方法以这样一种方式序列化对象,以便您可以在之后重建它们,否则您将无能为力。

如果它确实正确序列化它们,则需要解析临时字符串,识别每个实体对象的所有单独字符串并从那里重建它们。

只有当每个实体对象的序列化字符串不包含方括号和逗号字符,或者它们正确地转义它们时,才能做到这一点。这是因为AbstractCollection.toString()方法在构建临时字符串时使用了这些特殊字符。

如果满足以上所有条件,您可以使用正则表达式解析临时字符串并获取每个单独的序列化实体对象。然后由您来重建对象并将它们添加到新列表中。

有关 Java 中的正则表达式,请参阅http://docs.oracle.com/javase/6/docs/api/java/util/regex/package-summary.html

于 2012-06-13T13:02:42.013 回答
0

toString()如果您以特定格式公开 toString() 中的每个字段,反向解析它,您可以获得格式化的原始对象,但这取决于实现,但通常情况并非如此

例如:

您无法从中形成人员实例,string因为 id 未公开

class Person{
  private long id;
  private String name;
  //stuffs
  @Override
  public String toString(){ return "Person  :" +name;}
}

也可以看看

于 2012-06-13T12:47:22.993 回答
0

这是一个想法:

使toString您的Entity类的方法生成与某种序列化程序(如 JAXB 或 XStream)兼容的 XML 字符串。然后,当您获得 a 时Collection.toString(),将其按 Entity 拆分(也许String.split()会有所帮助)。长话短说,您希望将实体 XML 定义返回到 String 中,您可以将其传递给 XML 反序列化器,反过来,它可以将您的字符串转换回该类型的 Object。

于 2012-06-13T13:14:15.760 回答