2012-06-13 2 views
4

У меня есть Список_массивыКак перестроить объект String в ArrayList <Entity>?

List<?> myList=new ArrayList(); 

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

Теперь MyList Имеет список лиц

Теперь я преобразовать этот список в строку, так что это строковый объект в настоящее время.

String temp=myList.toString(); 

Мой вопрос заключается в том, как преобразовать эту временную строку снова в этот myList (список сущностей) ???

Любые идеи?

My Temp Значение выглядит следующим образом

темп = "[entityObject1, entityObject2 .......]" ..

я не мог извлечь каждый объект и бросьте с этим классом сущностей. есть ли способ?

Спасибо ..

ответ

2

Я сделал образец программы для этого преобразования. Вещи, о которых вы должны быть осторожны. 1. Класс, чей список, с которым мы будем работать, должен иметь по методу toString. (У вас может быть собственный формат toString() , но нужно соответственно изменить остальную реализацию).

Образец содержимого Класс объекта с использованием метода overString 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; 
    } 

} 

Основной Application.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; 
    } 
} 
+0

Я проверю этот Акил .. Спасибо за ваши усилия ... –

+0

получил логику Акил .. Спасибо снова: –

0

Это зависит от toString() реализации, если вы выставили каждое поле в ToString() в определенном формате разбор его обратным вы можете получить исходный объект отформатирован, но в целом это не так

Например:

Вы не можете сформировать человека экземпляр из string, потому что идентификатор не подвергается

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

Смотрите также

+0

ToString() является методом по умолчанию right..I я использую спящий режим, так что возвращает список лиц (означает список определенного класса со всеми столбцами) .. я не смог повторно преобразовать этот строковый объект в этот исходный список –

+0

, вы можете переопределить 'toString()', но зачем это нужно? –

+0

см. Мой метод fetchQuery() вернет список ниже класса .. class Person { private long id; имя частной строки; } –

0

Когда вы myList.toString(); вы на самом деле вызываете метод AbstractCollection.toString(), который, в свою очередь, вызывает метод toString() для каждого из объектов в Списке.

Если метод toString() класса Entity не сериализует объекты таким образом, что вы можете их впоследствии восстановить, вы ничего не сможете сделать.

Если он правильно сериализует их, вам необходимо проанализировать временную строку, идентифицировать все отдельные строки для каждого объекта Entity и восстановить их оттуда.

Это можно сделать, только если сериализованные строки для каждого из объектов Entity не содержат квадратных скобок и запятых, или если они уходят от них должным образом. Это связано с тем, что метод AbstractCollection.toString() использует эти специальные символы при создании строки temp.

Если все вышеуказанные условия выполнены, вы можете использовать регулярные выражения для синтаксического анализа строки temp и получения каждого из отдельных сериализованных объектов Entity. Тогда вам решать, как восстановить объекты и добавить их в новый список.

Для регулярных выражений в Java см. http://docs.oracle.com/javase/6/docs/api/java/util/regex/package-summary.html.

+0

Могли бы пояснить, почему вы считаете, что скобки или запятые будут проблемой для синтаксического анализа строки в наборе объектов? –

+0

, когда я делаю это String temp = myList.toString(); Строковое значение похоже на это ----> temp = "[entityObject1, entityObject2 .......]" .. я не мог извлечь каждый объект и бросить его с этим классом сущности .. есть ли способ? ? –

0

Вот идея:

Сделать toString метод вашего класса Entity генерировать строку XML, совместимый с какой-то сериализатором как JAXB или XStream. Затем, когда вы получите Collection.toString(), разделите его на Entity (возможно, String.split() может помочь). Короче говоря, вы хотите, чтобы XML-определение сущности возвращалось в String, которое вы можете передать вам десериализатор XML, который, в свою очередь, может преобразовать вас обратно в объект этого типа.