Özel Veriler Serileştiriliyor

Uyarı

These docs were written for SpongeAPI 7 and are likely out of date. If you feel like you can help update them, please submit a PR!

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

Whenever you’re reading a serialized object, it’s tempting to read all the individual values yourself in order to manually create all the required objects (and their parameters) for your data. However, depending on the data saved in the container there are a few ways that are far more convenient:

  • 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;

private String name = "Spongie";

@Override
public DataContainer toContainer() {
    return DataContainer.createNew()
            .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.

You’ll want to check that all the queries you want to retrieve are present using DataView.contains(Key...). If not, the data is likely incomplete and you should return Optional.empty().

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.

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

import net.kyori.adventure.text.Component;
import org.spongepowered.api.data.persistence.DataContentUpdater;

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"), Component.text(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.

As with other data, ensure that you register the translator during GameRegistryEvent.Register<DataTranslator<?>>.