Bir Java oyununu C# (Puppy Games tarafından Titan Attacks) haline getiriyorum ve şimdi oyun görevinin serileştirilmesi olan son görevden başka bir şey yapmıyorum. dosyaları kaydetmek için..Net serileştirme - kalıtım ağacında özel [Serializable] ile karıştırma
Tipik hiyerarşi: Kaynak (taban) -> Özellik-> Ekran/Efekt/kişilik-> GameScreen/LaserEffect/İstilacı
Java kodu kullanan standart ObjectOutputStream/ObjectInputStream ikili seri gerçekleştirmek ancak rahatsız edici/bazı readResolve gerçekleştirir için serileştirme işlemini özelleştirmek için temel sınıf düzeyinde (Kaynak) writeResolve çalışması (bir kaynak isimlendirildiyse, seri hale getirilmez ve daha sonra bir hashmap kaynağını almak için kullanılan bir adla bir proxy döndürür).
Benim saf çözümler ben bütün bahisler inşa kapalı olduğundan eminim, körü körüne ...
public virtual void GetObjectData(SerializationInfo info, StreamingContext context) {
if (name != null) {
// Got a name, so send a SerializedResource that just references us
info.AddValue("name", this.name);
info.SetType(typeof(SerializedResource));
return;
}
//Serialize just MY fields (defined in Resource)
this.SerializeMyFields(info, context, typeof(Resource));
}
Q bu yaklaşımı kopyalayıp TYPE geçersiz kılmak için temel sınıf içinde ISerializable uygulamaktır) Böylece - serileştirme ve serileştirme kurucusu ile birlikte miras zincirinin sonuna kadar ISerializable uygulamak zorundayım?
Not GetObjectData sanal olarak türetilmiş sınıflar, alanlarını serileştirebilir ve sonra temel sınıfı arayabilir. Bu çalışır ama bu LOTS sınıfı (100s) ekleyerek bir sıkıcı iştir. Bazı türetilmiş türler (Sprite, InvaderBehaviour, vb) ayrıca, daha da kötüsü yapmak için özel seri hale getirme işlemi de gerçekleştirir.
Jeffrey Richter'in konuyla ilgili makalelerine baktım ve bunun yerine bir ResourceSurrogateSelector: ISerializationSurrogate türü yapısını kullanmayı denedim, ancak bu serileştirme yöntemleri yalnızca serileştirilmekte olan tür bir Kaynaktır ve kaynaktan türeyen bir tür değilse çağrılır. Bir Invader ya da GameScreen'i serileştirme denenmez) Bunu yapmak için akıllıca bir yol var mı?
İki kod üssünü birbirine çok yakın tutmayı başardım ve bu dönüşümü çok daha kolay hale getirdi - Bu yaklaşımı burada (XmlSerializer, Protobuf, vb. gerçekten zorlayıcı bir sebep değil.
İşlemi otomatikleştirmek ve seri hale getirilebilen arabirimi uygulayan türleri yansıtacak ve tüm. Net serileştirme koduna sahip bir .cs dosyası oluşturabilmem için ana Java dosyalarını yazmadığım için Java yazmayı düşündüm (Kısmi yapıyorum)
PS - Hedef platformlar, bir şeylerin (yani sürüm 4) .Net tarafında ve muhtemelen PS Vita/belki iOS'u Mono kullanarak Windows8/Surface/XBox360 olacaktır. Kurtarılmaları, serileştirildikleri platformda serileştirilir.
DÜZENLEME bu yazı Sergey Teplyakov tarafından bir cevap .... .NET, C#: How to add a custom serialization attribute that acts as ISerializable interface ... istenilen türetilmiş sınıfları seçerek yardımcı olacak gibi görünüyor ISurrogateSelector arayüzüne beni yol açmıştır.