Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Generic tipi Arraya Cast etme
#1
Geliştirmekte olduğum projece kullanıcının girdiği yüzlerce iç içe geçmiş kayıtlardan oluşan diziler mevcut. Bunları veri tabanına kaydederken bağlantı sorunları nedeniyle bazen program sunucuya erişemediğinden çökme yaşanıyor ve kullanıcının girmiş olduğu bilgiler uçuyor. Bunun önüne geçebilmek adına hafızadaki bu kayıt dizilerini JSON kullanarak Seri hale getirmek istiyorm. JSON kullanma sebebim ileride mail ile bu JSON dosyasını programı kullanan diğer kullanıcılara ulaştırarak veri girişini basitleştirmek. JSON Kütüphanesi adresten bir JSON kütüphanesi buldum. Kayıtları başarılı bir şekilde Serialize ediyor. Ancak Deserialize ettikten sonra Benim kayıt dipine Cast ederken hata veriyor.  Debug den baktığımda verileri Değişkende görebiliyorum ancak Cast ederken hata veriyor.

procedure TfrmSerializationRecords.actSerRecordExecute(Sender: TObject);
var
 LVal: TMyRecord;
begin
 LVal.Speed := TEnumSpeed.Low;
 LVal.One := 'Barış Manço';
 LVal.Two := 42;
 SerializeSimple<TMyRecord>(LVal);
end;



buda Deserialize kısmı

procedure TfrmSerializationBase.DeserializeSimple<T>(AValue: T);
var
 LVal: T;
 KayitTipi:TMyRecord;
begin
 LVal := DeserializeValueTo<T>(AValue, memoSerialize.Lines, frmConfiguration.BuildSerializerConfig);

 KayitTipi:= TMyRecord(LVal); // Yukarıda aslında kayıt tipine göre Deserialize yapıp T değişkene atıyor ancak Statik değişkene atmıyor.

 SerializeValueFrom<T>(
   TValue.From<T>(LVal), memoDeserialize.Lines, frmConfiguration.BuildSerializerConfig);
end;



Aşağıda resimde LVal değişkenin içeriğinde veriler gözüküyor ancak T generic değişkenini Record tipine alamıyorum.


Ek Dosyalar Resimler
   
Cevapla
#2
Yapacağım açıklamalardan sonra; çözüm üretecek farklı bir arkadaş yok mu diye sorabilirsiniz muhtemelen.  Shy  (Çünkü önünüzdeki mevcut problemi, mevcut kaynaklarınızla çözmeye yönelik açıklama değil.)
Forumda daha önceleri bir kaç defa benzer konularda aynı cevabı yazdım.
Burada da yazmakta fayda olacağını düşünüyorum.
Projenin sürdürülebilirliği açısından doğal kütüphane ve doğal kaynaklarla çalışmak gerekiyor. Örneğin halihazırda kullandığınız bileşenin ilerleyen süreçte kendini günceleyememesi ile birlikte yeni IDE'ye entegrasyon sorunları, belki de yeni çıkacak bir işletim sistemine (Win 12,13 vb) de adaptasyon sorunu yaşayabilirsiniz.
Delphi'nin mevcut JSON kütüphaneleri oldukça iyi. Zaman ayırabilirseniz, mevcut işi System.JSON veya REST.JSON kütüphanelerindeki sınıflar aracılığıyla serialize ve deserialize etmenizde fayda var.
Begin : = end / 2;
Cevapla
#3
(14-03-2022, Saat: 14:33)RAD Coder Adlı Kullanıcıdan Alıntı: Yapacağım açıklamalardan sonra; çözüm üretecek farklı bir arkadaş yok mu diye sorabilirsiniz muhtemelen.  Shy  (Çünkü önünüzdeki mevcut problemi, mevcut kaynaklarınızla çözmeye yönelik açıklama değil.)
Forumda daha önceleri bir kaç defa benzer konularda aynı cevabı yazdım.
Burada da yazmakta fayda olacağını düşünüyorum.
Projenin sürdürülebilirliği açısından doğal kütüphane ve doğal kaynaklarla çalışmak gerekiyor. Örneğin halihazırda kullandığınız bileşenin ilerleyen süreçte kendini günceleyememesi ile birlikte yeni IDE'ye entegrasyon sorunları, belki de yeni çıkacak bir işletim sistemine (Win 12,13 vb) de adaptasyon sorunu yaşayabilirsiniz.
Delphi'nin mevcut JSON kütüphaneleri oldukça iyi. Zaman ayırabilirseniz, mevcut işi System.JSON veya REST.JSON kütüphanelerindeki sınıflar aracılığıyla serialize ve deserialize etmenizde fayda var.


Öncelikle teşekkür ederim. Benim düşüncemde bu yönde. Ama bir yerde artık mecburen 3.parti bileşenlere bulaşıyoruz. Sorun derlemede Delphi Idenin uyumsuz type Cast hatası vermesi. Belkide bu hatayı kapatmak için veya bu hatayı vermemesi için derleyici kodu vardır die düşünüyordum. Yada Generic tipler referans tipinde ramde yerleştiriliyordur gibi bir durum vardır altta
Cevapla
#4
Generics'lerin sağladığı faydalar arasında; Type casting'i azaltarak olası casting hataları önlemek, algoritmayı türden bağımsız yazarak, kod tekrarını önlemek gibi faydaları var.

- Sorunuzu başlığında "Generic tipi Arraya Cast etme" yazıyor. Bir array tanımı, yapısı göremedim.
- AValue parametresine neden ihtiyaç var ?
- DeserializeValueTo fonksiyonun T type parametresine, neden dönüştürmek istediğimiz yapıyı (TMyRecord) geçmiyoruz. ? DeserializeValueTo<TMyRecord>....
DeserializeSimple nerde ve hangi parametre değeri geçilerek çağırılıyor.

procedure TfrmSerializationBase.DeserializeSimple<T>(AValue: T);
var
 LVal: T;
 KayitTipi:TMyRecord;
begin
 LVal := DeserializeValueTo<T>(AValue, memoSerialize.Lines, frmConfiguration.BuildSerializerConfig); // AValue parametresine neden ihtiyaç var ?

 KayitTipi:= TMyRecord(LVal); // Neden burada cast ediyoruz. ??

SerializeValueFrom<T>(
  TValue.From<T>(LVal), memoDeserialize.Lines, frmConfiguration.BuildSerializerConfig);
end;
WWW
Cevapla
#5
(16-03-2022, Saat: 00:08)ismailkocacan Adlı Kullanıcıdan Alıntı: Generics'lerin sağladığı faydalar arasında; Type casting'i azaltarak olası casting hataları önlemek, algoritmayı türden bağımsız yazarak, kod tekrarını önlemek gibi faydaları var.

- Sorunuzu başlığında "Generic tipi Arraya Cast etme" yazıyor. Bir array tanımı, yapısı göremedim.
- AValue parametresine neden ihtiyaç var ?
- DeserializeValueTo fonksiyonun T type parametresine, neden dönüştürmek istediğimiz yapıyı (TMyRecord) geçmiyoruz. ? DeserializeValueTo<TMyRecord>....
DeserializeSimple nerde ve hangi parametre değeri geçilerek çağırılıyor.

procedure TfrmSerializationBase.DeserializeSimple<T>(AValue: T);
var
 LVal: T;
 KayitTipi:TMyRecord;
begin
 LVal := DeserializeValueTo<T>(AValue, memoSerialize.Lines, frmConfiguration.BuildSerializerConfig); // AValue parametresine neden ihtiyaç var ?

 KayitTipi:= TMyRecord(LVal); // Neden burada cast ediyoruz. ??

SerializeValueFrom<T>(
  TValue.From<T>(LVal), memoDeserialize.Lines, frmConfiguration.BuildSerializerConfig);
end;


  Merhabalar öncelikle haklısınız kodlarda Array yok. Ama benim anlattığım mantıkta Recordlerden oluşan bir Array yapım var.  AValue değeri zaten yukarıda belirtiğiniz TfrmSerializationBase.DeserializeSimple<TMyRecord>(AValue: T); gibi fonksiyona Deserialize edilecek olan değerleri taşıyor.


   KayitTipi:= TMyRecord(LVal); Bunu aslında Deserialize den sonra Cast etmeden almam gerekiyor çünkü zaten Record tipini verdim. Ama malesef Delphi hata veriyor o yüzden göstermek için fonksiyon içine yazdım. Aslında burda olmayacak o kod.
Cevapla
#6
De-serialize etmek istediğiniz json verisini ve TMyRecord tanımını paylaşabilir misiniz.
WWW
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
Information Uygulama yönetici olarak mı çalışıyor? (runtime tespit etme) bakyuz 0 398 28-04-2025, Saat: 17:22
Son Yorum: bakyuz
  WebBrowser Pdf Kayıt Etme sadoal351 1 1.254 11-07-2023, Saat: 12:39
Son Yorum: delphiman
  Memo içerisinde 4 kolonlu tablo tipi string göstermek (String Format) Syntax 4 2.389 05-05-2023, Saat: 11:02
Son Yorum: Bay_Y
  cxgrid Excel içine sayfa sayfa export Etme Mesut 2 1.725 08-09-2022, Saat: 15:39
Son Yorum: Mesut
  Delphi 'de exe içinde ki database ip tespit etme delphiX14 6 3.516 29-08-2022, Saat: 13:09
Son Yorum: tuna



Konuyu Okuyanlar: