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.
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.
(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.
(Çü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
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;
(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.
De-serialize etmek istediğiniz json verisini ve TMyRecord tanımını paylaşabilir misiniz.