Giriş
Şu satırı dahil ederiz.
Okuma İçin Kullanım
Şöyle yaparız
2 tane çalışma modu var. Açıklaması şöyle.
1. Enhanced Mod
XStream Enhanced Mode'da çalışıyorsa default constructor'ı çağırmaz.
Şu satırı dahil ederiz.
import com.thoughtworks.xstream.XStream;
Açıklaması şöyle.XStream uses the underscore to escape characters in identifiers that are valid in Java but invalid in XML (see here).Bu sınıf XML'deki klasik şu başlığı eklemiyor.
"<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>";
Kullanım
XStream kullanması son derece kolay bir kütüphane
- Class için alias ve Field için alias tanımlamaya izin verir. Böylece class için "fully qualified name" kullanılmayabilir
- Belirtilen Field'lar yazma işleminde es geçilebilir (omit)
- Belirtilen Field'lar okuma işleminde XML'de var ancak kodda yoksa dikkate alınmayabilir (ignore)
- Belirtilen Field'lar tag yerine attribute olarak yazılabilir
- Bazı nesneler için Converter yazılabilir. Böylece XML' yazarken veya XML'den okurken özel (custom) kodlama yapılabilir.
Migration
Bir seferinde bu sınıfı ile yazılmış veriyi yeni haline çevirmek için kullanmak gerekti. ignoreUnknownElements() kullanılarak XML ve kod farkı dikkate alınmadı. Daha sonra koddaki her nesnenin field'ları üzerinde clazz.getDeclaredField() ile dolaşıldı, yeni değer atandı ve kaydedildi
Şöyle yaparız
String xmlFile = ...;
XStream xstream = new XStream();
try(ObjectInputStream stream = xstream.createObjectInputStream(new FileReader(xmlFile)){
List<Foo> fooList = (List<Foo>) stream.readObject();
...
} catch(Exception e){
...
}
Yazma İçin Kullanım
Şöyle yaparız
ÖrnekŞöyle yaparız
String xmlFile = ...;
List<Foo> fooList = ...;
XStream xstream = new XStream();
try(ObjectOutpuStream stream = xstream.createObjectOutputStream(new FileWriter(xmlFile)){
stream.writeObject(fooList);
...
} catch(Exception e){
...
}
constructor - ReflectionProvider
2 tane çalışma modu var. Açıklaması şöyle.
XStream has two modes of operation: Pure Java and Enhanced. In pure Java mode, XStream behaves in the same way across different JVMs, however its features are limited to what reflection allows, meaning it cannot serialize certain classes or fields. In enhanced mode, XStream does not have these limitations, however this mode of operation is not available to all JVMs.
Hangi mod seçilirse seçilsin altta XML parser kütüphanesi olarak XppDriver kullanılıyor.
XStream Enhanced Mode'da çalışıyorsa default constructor'ı çağırmaz.
Örnek
Şöyle yaparız.XStream xstream = new XStream();
2. PureJavaReflectionProvider ModuAçıklaması şöyle. Yani default constructor'a sahip olmayan nesneler için kullanılamaz.
This would force XStream create new objects using Class.newInstance() - and prevents you from (de)serializing classes without default constructor. The other way is to implement a method called readResolve() which will be called after the object has been created:Örnek
Şöyle yaparız. Burada Enchanced Mode'dan vazgeçiyoruz.
XStream xs = new XStream(new PureJavaReflectionProvider());
constructor - HierarchicalStreamDriverBurada ReflectionProvider olarak Enhanced Mod otomatik olarak seçiliyor ancak XML parser kütüphanesini seçebiliyoruz
Örnek - DomDriver
Şöyle yaparız.
Şöyle yaparız.
Şöyle yaparız.
marshall metodu
Şöyle yaparız.
Şöyle yaparız.
Şöyle yaparız.
XStream xs = new XStream(new DomDriver("UTF-8"));
Örnek - Dom4JDriverŞöyle yaparız.
XStream xmlStream = new XStream(new Dom4JDriver());
Örnek - XppDriver
xpp and xmlpull eski kütüphaneler.Örnek - StaxDriver
XStream xmlStream = new XStream(new StaxDriver());
addImplicitCollection metodu
A sınıfı içinde List<B> tipinden listofB isimli bir alan olsun. Normalde bu liste bir kök düğüm ile XML'e çevrilir. Kök düğüm olmasın istiyorsak şöyle yaparız.
Şöyle yaparız. Blog isimli sınıf görünce tüm paket ismi yerine yani com.foo.bar yerine sadece blog yazar.A sınıfı içinde List<B> tipinden listofB isimli bir alan olsun. Normalde bu liste bir kök düğüm ile XML'e çevrilir. Kök düğüm olmasın istiyorsak şöyle yaparız.
xstream.addImplicitCollection(A.class,"listOfB");
alias metodu - Class Aliasingxstream.alias("blog", Blog.class);
aliasField metodu
Sınıf içindeki alana yeni bir isim verir.
Örnekxstream.alias("newName", Blog.class,
"fieldName");
allowTypes metodu
Class<?>[] classes = new Class[] { ABC.class, XYZ.class };
XStream xStream = new XStream();
XStream.setupDefaultSecurity(xStream);
xStream.allowTypes(classes);
fromXML metodu
Şöyle yaparız.
String xml = ...;
Foo foo = (Foo) xstream.fromXML(xml);
ignoreUnknownElements metodu
XML'de olup, kodda olmayan tag'leri dikkate almaz.
Örnek
Şöyle yaparız
XStream xstream = new XStream();
xstream.ignoreUnknownElements();
Şöyle yaparız.
XStream xStream = ...;
StringWriter writer = new StringWriter();
xStream.marshal(foo, new PrettyPrintWriter(writer) {
@Override
public void addAttribute(final String key, final String value)
{
if (!key.equals("class"))
{
super.addAttribute(key, value);
}
}
});
return writer.toString();
processAnnotations metoduŞöyle yaparız.
XStream xstream = new XStream();
xstream.processAnnotations(Foo.class);
setAliases metoduŞöyle yaparız.
Map<String, Class> aliases = new HashMap<>();
aliases.put("customer", Customer.class);
XStreamMarshaller ummarshaller = new XStreamMarshaller();
ummarshaller.setAliases(aliases);
setConverters metoduŞöyle yaparız.
XStreamMarshaller ummarshaller = new XStreamMarshaller();
ummarshaller.setConverters(customFooConverter);
toXML metoduŞöyle yaparız.
Foo foo = ...;
XStream xstream = new XStream();
xstream.processAnnotations(Foo.class);
String xml = xstream.toXML(foo);
Hiç yorum yok:
Yorum Gönder