Duyuruyu Kapat
Facebook Gözat
Twitter Gözat

C++ : Serialization

Konu, 'C / C++' kısmında ee++ tarafından paylaşıldı.

  1. ee++

    ee++ Daimi Üye

    Kayıt:
    25 Temmuz 2002
    Mesajlar:
    1,122
    Beğenilen Mesajlar:
    0
    Şehir:
    Ankara
    Selamlar,

    Yeni programlama yılını açıyorum!

    Şimdi aklıma gelen bir şeyi söylicem ve doğru olup olmadığını da sayın üstadlarımdan doğru düşünüp düşünmediğimi öğrenmek istiyorum.

    Bildigimiz üzre, 'serileştirme' denen bir olay vardır. Nesnelerin akımlara aktarılması olarak tanımlayasım geliyor.. Emin değilim.. Acaba bu, standart C++'ta nasıl olur? Ben Yerleştirme new'ü ile işin çözülebileceğini düşündüm. Bu new'ü geçenlerde acehreli üstadımdan öğrenmiştim. Kendileri ne der acaba? Kavramları ve sorumun cevabını biraz açabilirler mi?

    Teşekkürler.
     
    Son düzenleme yönetici tarafından yapıldı: 19 Ekim 2002
  2. acehreli

    acehreli Ali Çehreli

    Kayıt:
    19 Ekim 2002
    Mesajlar:
    4,973
    Beğenilen Mesajlar:
    2
    Kusura bakma Ersin, ama benim bu konuda fazla deneyimim yok. Gerek duyduğum zaman herhalde ben de gidip bir 'serialization' kütüphanesi bulacağım. :)

    Aslında ben de başından beri 'operator>>'ın biraz garip olduğunu düşünürüm. (Hiç yazmak zorunda da kalmadım :) ) Akla gelen ilk kullanım şöyle:

    Sinif nesne;
    cin >> nesne;

    Böyle yapınca nesne önce varsayılan kurucusuyla kuruluyor, ondan sonra da öğelerinin değerleri operator>> ile değiştiriliyor. Yani iki adımlı bir iş... Keşke "girişten okuduğun değerlerle bir nesne oluştur" diyebilseydik. Ama herhalde onu da açıkça yapmak mümkün:

    Sinif nesne(cin);

    Ama bu durumda da kurucuyu nasıl yazacağız? Kurucu işleve girdiğimiz noktada zaten bütün öğeler yine kendi varsayılan kurucularıyla kurulmuş oluyorlar:

    Sinif::Sinif(istream & is)
    {
    // Bu noktada zaten herkes kuruldu
    // (Temel türden olan öğeler hariç.)
    /* ... */
    }

    Yoksa nesneyi bir işlev mi döndürse:

    Sinif * kur(istream & is)
    {
    Sinif * nesne = (Sinif *)malloc(sizeof(Sinif));
    /* Söylediğin gibi, burada yerleştirme
    'new'ünü kullanabiliriz */
    /* bkz. Not 3 */
    return nesne;
    }

    Not 1: Böyle olursa, bütün nesneler yığında (heap) kuruluyorlar. Bu ne kadar iyi veya kötü?

    Not 2: Burada kaynak denetimini gözardı ettim. Belleğin sorumluluğunu işlevi çağırana geçirdiğimizi göstermek için auto_ptr<Sinif> (veya başka bir akıllı gösterge) döndürmemiz gerekir. Ama böyle yaptığımızda o akıllı göstergenin 'delete'i çağırmaması gerekir :) Bu yüzden, auto_ptr 'delete'i çağıracağı için burada kullanılamaz. :)

    Not 3: Açıklama olarak bıraktığım bölümde, hâlâ yukarıda değindiğim sorunlarla sınıf öğeleri için de karşı karşıyayız.

    Gördüğün gibi ben bu konuda çözümden çok soru üretiyorum :)

    Ali
     
  3. ee++

    ee++ Daimi Üye

    Kayıt:
    25 Temmuz 2002
    Mesajlar:
    1,122
    Beğenilen Mesajlar:
    0
    Şehir:
    Ankara
    Öncelikle Hoşgeldin Ali, seni burada (ve her yerde :) :) görmek gerçekten çok güzel; katılımının devamını diliyoruz.

    Şimdi senin de dediğin gibi cin>>nesne ile iki aşamalı bir iş gerçekleşiyor. Bu sorunlar yol açmıyor mu? Yer ayırmak için yaratılan nesnenin kurucusu çalıştığına göre (?) bir takım bellek işlemleri (yer ayırma) filan oluyorsa nasıl oluyor? Yani kurucu için de new çağrılıyor olabilir, ama bizim şu an okumak istediğimiz ve daha önce akıma yazmış oldugumuz nesnede, yazmadan once new'ün karşılığı bir delete çağırdık belki.. Şimdi cin>>nesne ile aldığımızda o alana ne alınacak?

    Biraz karıştı ama.. :)

    Buna rağmen yerleştirme new'ü ile daha sorunsuz gibi bu iş. Yani sonuçta onda, sadece bellek alanı ayrılıyor ve o alana yazılıyor nesne. Yani ayrılma sırasında nesne oluşturulmuyor, kurucu çağrılmıyor, yanılıyor muyum? Aslında şimdi düşündüm de, şu nesnenin sahip olabileceği devingen ogeler kafamı karıştırdı.. :) Nasıl oluyor bu iş?

    Teşekkürler.