我有一個具有一組屬性的類,我將其用作用戶級別設定。每個屬性都有一個默認值屬性。很少有 XmlIgnore 屬性來避免序列化。
當將此類物件序列化為記憶體流并且它寫入正確時,但在反序列化時,它實際上創建了一個具有所有屬性默認值的物件,該默認值不是序列化物件的一部分。如何忽略少數屬性的默認值初始化?提前致謝。
XmlSerializer serializer = new mlSerializer(typeof(DisplayPreferences));
DisplayPreferences newPrefs = null;
MemoryStream ms = new System.IO.MemoryStream(System.Text.Encoding.UTF8.GetBytes(prefs));
newPrefs = (DisplayPreferences)serializer.Deserialize(ms);
if (newPrefs != null)
{
newPrefs.CopyTo(Editor.prefs);
}
此應用程式內置于 .NET 4.6 (winforms)
uj5u.com熱心網友回復:
歡迎來到stackoverflow。
您提供的關于如何反序列化它們的資訊很少(代碼片段會有所幫助),但我假設您正在將它們反序列化為型別化物件。如果是這種情況,那么您所經歷的是標準行為。這就是默認值的全部意義,您不能“部分反序列化型別化物件”。
但是,您可以做的是:
將物件反序列化為原始 xmlObject,并為其撰寫自定義序列化程式。
使屬性可以為空,這通常是 DTO 有用的地方。見下文。
public class SomeTypedObjectDTO { public Guid? NullableGuid { get; set; } public int? NullableInt { get; set; } }
- - 更新 - -
我厭倦了讓它與你的代碼保持一致。假設您有以下物件。
public class DisplayPreferences
{
public Guid Id { get; set; }
public string Name { get; set; }
public int Level { get; set; }
public bool CanDisplay { get; set; }
}
假設您只想序列化“CanDisplay”和“level”屬性。您可以為它創建一個 DTO(資料傳輸物件),它基本上是原始物件的精簡版本。
DTO:
public class DisplayPreferencesDTO
{
public int Level { get; set; }
public bool CanDisplay { get; set; }
}
然后我相信您需要做的就是更改通用 typeof() 以使用 DTO 而不是實際物件。
XmlSerializer serializer = new mlSerializer(typeof(DisplayPreferencesDTO));
然后,您可以根據需要將 DTO 映射回原始物件。您可以手動執行此映射,也可以使用名為Automapper的框架。Automapper 是專門為映射 DTO 而設計的。
如果您需要我澄清任何事情,請告訴我。
快樂編碼!
uj5u.com熱心網友回復:
您可能想讓它們為空?只是讓它們成為可為空的道具,例如將int設為int?
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/476528.html
上一篇:在專案層之間傳遞的結果類
