2008-11-20 68 views
3

我有一個程序,用戶在場景中添加多個對象。這些對象都被表示爲一個類。 現在我希望用戶能夠保存場景,因此可以再次加載。如何保存一個C#應用程序的狀態,以便以後可以加載

是否有一些我可以使用的genereic save方法,還是我必須編寫自己的方法來保存所有屬性的值,然後在用戶再次加載場景時創建新對象並將保存的值插入到它們中。

/P

編輯:感謝您的快速回復傢伙。 實際上,我現在將對象的默認值存儲在SQL compact 3.5數據庫中。所以如果有人知道如何序列化到SQL,那將是很好的信息。

編輯2:再次感謝!我將序列化爲xml,然後將其作爲字符串存儲到SQL數據庫中。

回答

5

假設您的對象具有作爲公共屬性提供的所有值,可以使用XMLSerializer將該對象轉換爲XML字符串,然後使用XMLDeserializer重新創建該對象。

有一種擴展方法來完成這個here

如果您有私有變量,您仍然可以編寫自己的自定義序列化/反序列化方法。

編輯迴應原來的問題編輯:

可以使用任意的這些序列化技術將字符串存儲到數據庫中。另一種選擇是使用ORM(對象關係映射器)來彌補對象與數據庫之間的差距。

2

通常會使用數據庫來做這種事情。這可能是推薦的做法。

但是,如果你想要一個快速和骯髒的方法,你可以序列化到Xml或二進制相對較少的代碼。看看System.Runtime.Serialization的東西。 Xml或Binary的折衷在於版本控制很糟糕。

考慮包含來自1.0應用程序的對象的xml文件的集合。如果你從1.0開始向這些對象添加字段,那麼它們將不會與任何新的1.1對象兼容。爲了解決這個問題,你必須編寫一個1.0 - > 1.1的手動更新序列。更糟糕的是,如果使用自動發現代碼(自動序列化),例如他們的XML或二進制序列化程序,則甚至可能必須爲您的對象命名不同的名稱Product1/Product1.1/etc,它可以是或者編寫自己的序列化代碼。

如果您的應用程序開始接近任何嚴重程度,我會說你可能會想要使用數據庫。 SqlLite對於1個用戶應用程序非常好,並且非常簡單,任何更大的應用程序都需要適當的RDBMS。

+0

如果應用程序尚未使用數據庫,海報不會聲明。如果沒有,我不會推薦將其引入。將XML序列化爲文件。就像MSWord一樣。 – Anthony 2008-11-20 15:23:18

1

你也可以看看db4o,這是一個簡單的對象數據庫。

0

.NET序列化是最簡單的方法,儘管版本控制可能會成爲前面提到的問題。這可能不是一個大問題,取決於你的對象有多複雜。您的序列化/反序列化邏輯需要足夠聰明,以處理缺少屬性的情況,或者對於在舊版本序列化的序列化對象中不存在的新屬性具有默認行爲。主要是通過捕獲SerializationExceptions並在那裏處理它們來處理。

我想你會對數據庫也有這個問題 - 除了我想它會通過任何方法處理你用來遷移你現有的數據庫到最新版本(即添加一個新的列到RDBMS表或屬性到ODBMS對象)。

相關問題