我有一個使用TStringList的備份系統,但是我用舊的Delphi(Ansi字符串)編碼。從舊版本到最新版本的TStringList備份的兼容性
基本上我有此當我保存:
...
MyStringList.SaveToStream(Str);
StrSz := Str.Size;
MyBackupStream.Write(StrSz, SizeOf(Integer));
MyBackupStream.Write(Str.Memory^, StrSz);
...
,當我重新加載:
...
MyBackupStream.Read(StrSz, SizeOf(Integer));
Str.SetSize(StrSz);
MyBackupStream.Read(Str.Memory^, StrSz);
MyStringList.SetText := PChar(Str.Memory);
...
我用這個順序(大小+命令datasize字節,則大小+命令datasize字節等)系統用於各種組件備份。事實上,在stringlist備份之前(我的意思是在StringList備份之前和之後有一些數據)之前,一些東西總是被'讀取'或'寫入'。
我在這裏引入了一個大問題(如果我切換到現代的Delphi版本)? 在未來的delphi版本中,塊仍然可以被castable(如果我切換?)。我需要在備份頭文件中寫入字符串版本嗎?
不幸的是我無法測試這個。我認爲,如果我至少在頭文件中編寫字符串編碼類型,那麼以後我可以用正確的方式將其轉換,無論是什麼版本的Delphi,不是嗎?
當我使用loadfromstream我得到AV。我在之前的項目中注意到了這一點,對於我來說,使用TStringList.SaveToStream保存數據的唯一方法是將保存的數據作爲字符串進行投射,如我的示例中所做的那樣。我知道這很奇怪,但我不能用另一種方式來做... – az01
AV意味着你正在訪問無效的內存。 TStringList指針或TStream指針無效。正確使用時,LoadFromStream()工作得很好。我從來沒有在任何版本中使用AV。如果你必須演員,那麼你需要做的比你之前展示的更安全。你顯示的內容不安全。它訪問不屬於TStream的周圍內存。 –
我已經將您的答案標記爲已接受,但更多要關閉該主題。在我的備份流中,我有一個版本號。即使沒有人在這裏明確地告訴我,我將能夠在最新版本的軟件中投入舊數據,但我認爲沒關係。但是你把重點放在我重新加載字符串的方式上。對我來說,這是好事...我不期待這樣的評論... – az01