#java #xml #serialization #builder #simple-framework
#java #xml #сериализация #Конструктор #simple-framework
Вопрос:
У меня есть класс с более чем 10 параметрами в конструкторе, и я хотел бы реализовать шаблон Builder. В то же время я хочу использовать простую сериализацию XML для создания объектов из XML-файлов. Есть ли какой-нибудь способ добиться этого?
import org.simpleframework.xml.*;
public class Example {
@Element(name = "field-1", required = false)
private final int field1;
@Element(name = "field-2")
private final int field2;
[...]
public simpleXMLConstructor(
@Element(name = "field-1", required = false) int field1,
@Element(name = "field-2") int field2,
[...]) {
this.field1 = field1;
this.field2 = field2;
[...]
}
}
Ответ №1:
Насколько я понимаю, у вас нет какого-либо конкретного выбора для какой-либо библиотеки XML. Я бы рекомендовал использовать пакет Scilca XML Progression (SXP), доступный на GitHub. Чтобы написать код для сериализации объектов (где вы знаете, какой объект должен быть создан), вот простая реализация,
import org.scilca.sxp.*;
import org.scilca.sxp.exceptions.*;
public class main{
class XmlSerialization{.....} // We'll serialize this and
class XmlS2 {}
public static void main(String[] args){
// Write Data
Node rootNode = new XMLNode("ObjectSerializationData");
XMLNode firstObject = rootNode.add("XmlSerialization");
firstObject.add("IntField1").setValue("1");
firstObject.add("StringField2").setValue("strObject");
XMLNode secondObject = rootNode.add("XmlS2");
secondObject.add("IntField1").setValue("2"); // Added a element with a value
secondObject.add("BoolField2").setValue("false");
XMLNode thirdObject = rootNode.add("XmlSerialization");
thirdObject.add("IntField1").setValue("@null");
thirdObject.add("StringField2").setValue("str");
Document XmlDocument = new Document(rootNode);
Writer w = (Writer) XmlDocument.getWriter();
w.saveXML("D:/file.txt");
System.gc();
// Read and Deserialize
XMLReader xr = new XMLReader("D:/file.txt");
Document newXml = xr.parseDocument();
List<Node> XmlS1Nodes = newXml.searchMatches("XmlSerialization");
List<Node> XmlS2Nodes = newXml.searchMatches("XmlS2");
Node firstObject = XmlS1Nodes.get(0);
int field1 = (int) Double.parseDouble(firstObject.getAllChildren().get(0));
// Like this get all field and construct objects
}
}
Комментарии:
1. Нет, извините, это недопустимо, поскольку я должен использовать библиотеку, о которой я упоминал, и меня не должно волновать, где создаются объекты.