Однажды мне пришлось столкнуться с инцидентом, когда мне пришлось загрузить много данных (20 МБ +) из БД и заполнить их как объект java (объект java состоит из множества вложенных / ссылочных классов), и мне нужно было загружать это каждое раз я запустил свой сервер. Хотя у нас есть распределенный кэш, последующие загрузки будут очень быстрыми. Однако первая загрузка заняла более 9 минут …
Я думал, что вместо загрузки из БД при перезапуске сервера, я мог бы загрузить из локального файла! (поскольку данные в БД обновляются реже), вот где я узнал о библиотеке XStream , и это настолько просто, что я мог преобразовать любой объект Java в XML и обратно.
Здесь я покажу вам, как легко использовать библиотеку XStream
Сначала давайте создадим Sample Object (вы также можете использовать любой существующий класс) следующим образом
SampleObject.java
public class SampleObject {
private String name="Test";
private int testInt ;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getTestInt() {
return testInt;
}
public void setTestInt(int testInt) {
this.testInt = testInt;
}
}
и вспомогательный класс для преобразования XStreamTranslator.java
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
import com.thoughtworks.xstream.XStream;
public final class XStreamTranslator {
private XStream xstream = null;
private XStreamTranslator(){
xstream = new XStream();
xstream.ignoreUnknownElements();
}
/**
* Convert a any given Object to a XML String
* @param object
* @return
*/
public String toXMLString(Object object) {
return xstream.toXML(object);
}
/**
* Convert given XML to an Object
* @param xml
* @return
*/
public Object toObject(String xml) {
return (Object) xstream.fromXML(xml);
}
/**
* return this class instance
* @return
*/
public static XStreamTranslator getInstance(){
return new XStreamTranslator();
}
/**
* convert to Object from given File
* @param xmlFile
* @return
* @throws IOException
*/
public Object toObject(File xmlFile) throws IOException {
return xstream.fromXML(new FileReader(xmlFile));
}
/**
* create XML file from the given object with custom file name
* @param fileName
* @param file
* @throws IOException
*/
public void toXMLFile(Object objTobeXMLTranslated, String fileName ) throws IOException {
FileWriter writer = new FileWriter(fileName);
xstream.toXML(objTobeXMLTranslated, writer);
writer.close();
}
public void toXMLFile(Object objTobeXMLTranslated, String fileName, List omitFieldsRegXList) throws IOException {
xstreamInitializeSettings(objTobeXMLTranslated, omitFieldsRegXList);
toXMLFile(objTobeXMLTranslated, fileName);
}
/**
* @
* @param objTobeXMLTranslated
*/
public void xstreamInitializeSettings(Object objTobeXMLTranslated, List omitFieldsRegXList) {
if(omitFieldsRegXList != null && omitFieldsRegXList.size() > 0){
Iterator itr = omitFieldsRegXList.iterator();
while(itr.hasNext()){
String omitEx = itr.next();
xstream.omitField(objTobeXMLTranslated.getClass(), omitEx);
}
}
}
/**
* create XML file from the given object, file name is generated automatically (class name)
* @param objTobeXMLTranslated
* @throws IOException
* @throws XStreamTranslateException
*/
public void toXMLFile(Object objTobeXMLTranslated) throws IOException {
toXMLFile(objTobeXMLTranslated,objTobeXMLTranslated.getClass().getName()+".xml");
}
}
несколько тестов для проверки
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.io.FileUtils;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class XStreamTranslatorTest {
SampleObject sampleObj;
XStreamTranslator xStreamTranslatorInst;
/**
* @throws java.lang.Exception
*/
@Before
public void setUp() throws Exception {
sampleObj = new SampleObject();
xStreamTranslatorInst = XStreamTranslator.getInstance();
}
/**
* @throws java.lang.Exception
*/
@After
public void tearDown() throws Exception {
}
@Test
public void simpleObjectToXMLStringNotNullTest() {
String xml = xStreamTranslatorInst.toXMLString(sampleObj);
assertNotNull(xml);
}
@Test
public void simpleObjectToXMLStringVerifyTest() {
sampleObj.setName("Test");
assertEquals("Test",sampleObj.getName());
sampleObj.setTestInt(9);
assertEquals(9,sampleObj.getTestInt());
String xml = xStreamTranslatorInst.toXMLString(sampleObj);
String expected = getExpectedStringOutOfSampleObject();
assertEquals(expected, xml.replaceAll("[\\n\\s\\t]+", ""));
}
@Test
public void xmlToObjectVerifyTest(){
String xml = getExpectedStringOutOfSampleObject();
SampleObject sampleObj = (SampleObject) xStreamTranslatorInst.toObject(xml);
assertNotNull(sampleObj);
}
@Test (expected=IOException.class)
public void xmlToAnyObjectFromFileThatNotExists() throws IOException{
SampleObject sampleObj = (SampleObject) xStreamTranslatorInst.toObject(new File("C:\\MyHome\\mySampleCodes\\xstream-samples\\src\\test\\resources\\testNoFile.xml"));
assertNotNull(sampleObj);
assertEquals("somename",sampleObj.getName());
}
@Test
public void xmlToAnyObjectFromFile() throws IOException{
SampleObject sampleObj = (SampleObject) xStreamTranslatorInst.toObject(new File("C:\\MyHome\\mySampleCodes\\xstream-samples\\src\\test\\resources\\testSampleObject.xml"));
assertNotNull(sampleObj);
assertEquals("Test",sampleObj.getName());
}
@Test
public void objToXmlFileTestForNotNull() throws IOException {
SampleObject sampleObj = new SampleObject();
sampleObj.setName("Test2");
assertEquals("Test2",sampleObj.getName());
sampleObj.setTestInt(99);
assertEquals(99,sampleObj.getTestInt());
xStreamTranslatorInst.toXMLFile(sampleObj);
File file = new File(sampleObj.getClass().getName()+".xml");
assertTrue(file.exists());
String sample = FileUtils.readFileToString(file);
assertNotNull(sample);
}
@Test
public void objToXmlFileCreate() throws IOException {
SampleObject sampleObj = new SampleObject();
sampleObj.setName("Test2");
assertEquals("Test2",sampleObj.getName());
sampleObj.setTestInt(99);
assertEquals(99,sampleObj.getTestInt());
xStreamTranslatorInst.toXMLFile(sampleObj);
File file = new File(sampleObj.getClass().getName()+".xml");
assertTrue(file.exists());
String sample = FileUtils.readFileToString(file);
assertNotNull(sample);
assertEquals(getExpectedStringOutOfSampleObject2(),sample.replaceAll("[\\n\\s\\t]+", ""));
}
private String getExpectedStringOutOfSampleObject() {
return "<com.mysamples.thoughtworks.xstream.SampleObject><name>Test</name><testInt>9</testInt></com.mysamples.thoughtworks.xstream.SampleObject>";
}
private String getExpectedStringOutOfSampleObject2() {
return "<com.mysamples.thoughtworks.xstream.SampleObject><name>Test2</name><testInt>99</testInt></com.mysamples.thoughtworks.xstream.SampleObject>";
}
}
Добавьте следующую зависимость в ваш pom.xml (раздел зависимостей)
<dependency> <groupId>com.thoughtworks.xstream</groupId> <artifactId>xstream</artifactId> <version>1.4.5</version> </dependency>
Запустите тестовые примеры и убедитесь сами, как xml был сгенерирован из образца объекта и обратно в SampleObject.
Ниже приведен пример XML, который у меня есть ..
<com.mysamples.thoughtworks.xstream.SampleObject> <name>Test2</name> <testInt>99</testInt> </com.mysamples.thoughtworks.xstream.SampleObject>