13 Aralık 2020 Pazar

XStream Sınıfı - Okuma ve Yazma İçin Kullanılır

Giriş
Ş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


Okuma İçin Kullanım
Şö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
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
Örnek
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.

1. Enhanced Mod
XStream Enhanced Mode'da çalışıyorsa default constructor'ı çağırmaz.
Örnek
Şöyle yaparız.
XStream xstream = new XStream();
2. PureJavaReflectionProvider Modu
Açı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 - HierarchicalStreamDriver
Burada ReflectionProvider olarak Enhanced Mod otomatik olarak seçiliyor ancak XML parser kütüphanesini seçebiliyoruz

Örnek - DomDriver
Şö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
Şöyle yaparız.
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.
xstream.addImplicitCollection(A.class,"listOfB");
 alias metodu - Class Aliasing
Şöyle yaparız. Blog isimli sınıf görünce tüm paket ismi yerine yani com.foo.bar yerine sadece blog yazar.
xstream.alias("blog", Blog.class);
aliasField metodu
Sınıf içindeki alana yeni bir isim verir.
Örnek
Şöyle yaparız.  Blog sınıfı içindeki fieldName alanı XML'e newName tag'i ile yazılır.
xstream.alias("newName", Blog.class,"fieldName");
allowTypes metodu
Şöyle yaparız.
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();
marshall metodu
Şö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