![]() |
|
Generic tipi Arraya Cast etme - Baskı Önizleme +- Delphi Can (https://www.delphican.com) +-- Forum: Delphi (https://www.delphican.com/forumdisplay.php?fid=3) +--- Forum: Genel Programlama (https://www.delphican.com/forumdisplay.php?fid=6) +--- Konu Başlığı: Generic tipi Arraya Cast etme (/showthread.php?tid=6648) |
Generic tipi Arraya Cast etme - phi03 - 13-03-2022 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. Cvp: Generic tipi Arraya Cast etme - RAD Coder - 14-03-2022 Yapacağım açıklamalardan sonra; çözüm üretecek farklı bir arkadaş yok mu diye sorabilirsiniz muhtemelen. (Çü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. Cvp: Generic tipi Arraya Cast etme - phi03 - 15-03-2022 (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. Ö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 Generic tipi Arraya Cast etme - ismailkocacan - 16-03-2022 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; Cvp: Generic tipi Arraya Cast etme - phi03 - 17-03-2022 (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. 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. Generic tipi Arraya Cast etme - ismailkocacan - 17-03-2022 De-serialize etmek istediğiniz json verisini ve TMyRecord tanımını paylaşabilir misiniz. |