Однажды мне пришлось столкнуться с инцидентом, когда мне пришлось загрузить много данных (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>