Özel Veriler Serileştiriliyor

Seri haline getirme ve yavaşlatma yöntemi olmadan, verileriniz yeniden başlatıldığında da devam etmez. Spnge’nin verilerin türüne göre veriyi seri hale getirmek / yavaşlatmak için birkaç farklı yolu vardır:

  • DataSerializables, seri hale getirme işlemini gerçekleştirmek için bir arabirim uygular ve :javadoc: serbest bırakma ve yaratma için ‘DataBuilder’

  • DataManipulators da `` DataSerializable`` da uyguluyor, bunun yerineyavaşlatma ve oluşturma için bir :javadoc: DataManipulatorBuilder kullanıyoruz

  • ‘’DataSerializable’’ ın uygulanmasında kullanılamayan objeler use:javadoc: ‘Data Translator’ , hem serialization hemde deserialization için kullanılabilir

Bu, Java’da hemen hemen her nesnenin kaydedilmiş olması durumunda diske kaydedilebileceği anlamına gelir!

DataView okunuyor

Sıralı bir nesneyi her okuduğunuzda, verileriniz için gerekli tüm nesneleri (ve parametrelerini) el ile oluşturmak için tüm bireysel değerleri kendiniz okumanız caziptir. Bununla birlikte, konteynerde kaydedilen verilere bağlı olarak, çok daha kullanışlı birkaç yolu vardır:

  • Int, String, double, List ve Map gibi yaygın java tipleri, getInt (DataQuery), getString (DataQuery) vb. yerleşik yöntemlerde kullanılabilir. Bu tür listeler aynı şekilde alınabilir, örneğin getStringList (DataQuery).

  • ‘’DataSerializable’’ nesneleri ‘’getSerializable(DataQuery, Class)’’ veya ‘’getSerializableList(DataQuery, Class)’’ kullanılarak alınabilir. Yol ile birlikte, ‘’Home.class’’ seri hale getirilebilir türdeki “Class” da belirtmeniz gerekir.

  • Kayıtlı bir ‘’DataTranslator’’ nesneleri, ‘’getObject(DataQuery, Class)’’ veya ‘’getObjectList(DataQuery, Class)’’ kullanılarak alınabilir. Varsayılan olarak desteklenen sınıfların tam listesi şu adreste bulunabilir :javadoc: ‘DataTranslators’.

Her durumda, bir :javadoc: DataQuery kullanarak bir yol belirtmeniz gerekir. Verilerinizde karşılık gelen bir “Anahtar” varsa, “key.getQuery()” yi çağırmak kadar kolaydır. Aksi takdirde bunu yapmanın en kolay yolu ``DataQuery.of (“name”) ` `lardır.

Tüyo

DataQueries, örneğin, ``DataQuery.of (“my”, “custom”, “data”) `yı kullanarak ağaçtaki birden çok düğümdeki verilere referans vermek için kullanılabilir.

DataBuilders

Nesneyi seri hale getirilebilir yapmak için öncelikle onun uyguladığından emin olun :javadoc: DataSerializable. Yalnızca iki yöntem uygulamanız gerekir:

  • ‘’get ContentVersion()’’ - Verilerinizin geçerli sürümünü tanımlayar.

  • ‘’toContainer()’’ - serisini kaldırılmaya ve nesne çalışırken üreticinize verilecek olan şey budur. Yukarıdaki yöntemlerden birini kullanarak seri hale getirilebilir olduğu sürece, döndürülen ‘’DataContainer’’ da istediğiniz her şeyi saklayabilirsiniz. Verilerinizi belirtilen yola kaydetmek için ‘’set(DataQuery, Object)’’ yöntemini kullanın.

Tüyo

Sorgunuza “Queries.CONTENT_VERSION” parametresini kullanarak verilerinizin sürümünü de kaydetmeniz önerilir. Bu, güncelleme sürümlerini, :ref: content-updaters ile sağlanacaktır.

Kod Örneği: toContainer Uygulama

import org.spongepowered.api.data.DataContainer;
import org.spongepowered.api.data.DataQuery;
import org.spongepowered.api.data.Queries;
import org.spongepowered.api.data.MemoryDataContainer;

String name = "Spongie";

@Override
public DataContainer toContainer() {
    return new MemoryDataContainer()
            .set(DataQuery.of("Name"), this.name)
            .set(Queries.CONTENT_VERSION, getContentVersion());
}

Sonraki bölüm bir :javadoc:’DataBuilder’ uygulamaktır. :Javadoc:’AbstractDataBuilder’ uzatılması önerilir; çünkü sürüm mevcut sürümden düşükse verilerinizi yükseltmeye çalışacaktır. ‘’AbstractDataBuilder’’ kullanıyorsanız, uygulamanız gereken tek yöntem ‘’build (DataView)’’ veya ‘’buildContent(DataView)’’dir.

Almak istediğiniz tüm sorguların ‘’DataView.contains(Key…)’’ kullanılarak bulunup bulunmadığını kontrol edebilirsiniz. Veriler muhtemelen tamamlanmamış olabilir ve ‘’Optional.empty()’’ işlevine geri dönmelisiniz.

Her şey orada gibi gözüküyorsa değerleri oluşturmak ve yeni oluşturulan bir nesneyi ‘’Optional’’ olarak döndürmek için ‘’getX’’ yöntemlerini kullanın.

Sonunda, bu oluşturucuyu eklentiler tarafından bulunabilecek şekilde kaydettirmeniz gerekir. Bunu yapmak için, veri sınıfını ve oluşturucunun bir örneğini referans alarak DataManager#registerDataBuilder(Class, DataBuilder) ‘yi çağırın.

DataContentUpdaters

Yeni bir sürüm sürümündeki verilerin düzenini değiştirirseniz ne olur? :javadoc: DataContentUpdater sorunu çözdü. Seri hale getirilmiş nesne geçerli sürümden daha küçükse, bir AbstractDataBuilder veri deneyerek oluşturucuya geçirmeden önce güncelleyecektir.

Her güncelleyici, giriş ve çıkış sürümlerine sahiptir. Eski verileri alıp yeni bir düzene yükseltmek için gerekenleri değiştirmelisin. Eksik veri nedeniyle dönüşümü imkansız hale getiriyorsa bunun yerine başka yerde yorumlanmış bir varsayılan değer sağlamak mümkün olabilir - ana inşaatçı veya nesnenin kendisi gibi.

Sonunda, tüm “DataContentUpdater” ana veri sınıfını referans alarak “DataManager#registerContentUpdater()” ile kaydedildiğinden emin olmanız gerekir - bu onların oluşturucu tarafından bulunmasına izin verecektir.

Code Example: Implenting a DataContentUpdater

org.spongepowered.api.data.persistence.DataContentUpdater
org.spongepowered.api.text.Text

public class NameUpdater implements DataContentUpdater {

    @Override
    public int getInputVersion() {
        return 1;
    }

    @Override
    public int getOutputVersion() {
        return 2;
    }

    @Override
    public DataView update(DataView content) {
        String name = content.getString(DataQuery.of("Name")).get();

        // For example, version 2 uses a text for the name
        return content.set(DataQuery.of("Name"), Text.of(name));
    }
}

DataManipulatorBuilders

‘’DataManipulatorBuilder’’, “DataBuilder” çok benzer, ancak manipülatörler serisini kaldırılmak için doğrudan ilgili birkaç yöntem ekler:

  • ‘’create()’’, varsayılan değerlerle yeni bir manipülatör döndürmelidir

  • ‘’createFrom(DataHolder)’’ yapı yöntemine benzer, ancak bunun yerine değerler :javadoc: ‘DataHolder’ dan alınmalıdır. Eğer sahibinden alınacak veri yoksa, sadece ‘’create()’’ işlemine döndürmelisin. Veriler ‘’DataHolder’’ ile uyuşmuyorsa, bunun yerine ‘’Optional.empty()’’ döndürmelisiniz.

Tıpkı ‘’DataBuilder’’ gibi, manipülatörü okumalı ve ilgili ‘’build’’ yönteminde döndürmelisiniz.

‘’DataManipulatorBuilder’’ ve ‘’AbstractDataBuilder’’ uyguladığınız sürece, :ref:’content-updaters’ ile yararlanabilirler.

Bir ‘’DataManipulatorBuilder’’ kaydetmekte ‘’DataBuilder’’ benzer, ancak ‘’register()’’ yöntemini kullanır. Oluşturucu örneğine ilaveten, değiştirilebilir ve değiştirilemeyen sınıflara da yöntemde referans vermeniz gerekir.

Not

API’yi uygulamanızdan ayırdıysanız uygulama sınıflarına başvurmanız gerekir.

VeriÇeviriciler

Seri hale getirmek istediğiniz nesneler, çoğu zaman ‘’Vector3d’’ veya ‘’Date’’ gibi ‘’DataSerializable’’e uygulayan nesneler değildir. Bu nesnelere izin vermek için, :javadoc:’DataTranslator’, nesnenin sıralamasını ve deserialization both yönetir.

Uygulandığı gibi ‘’translate’’ bir “DataSerializable” için “toContainer()’’ ve ‘’build(DataView)’’ aynıdır, ancak veri durumunda bir ‘’InvalidDataException’’ atılır ‘’Optional’’ dönmek yerine kaybolur.

Diğer verilerde olduğu gibi çeviriciyi “DataManager#registerTranslator (Class, DataTranslator)” ile kaydettiğinizden emin olun.