C# XML 反序列化忽略默认值属性

C# XML Deserialize ignore Default value attribute

我有一个 class,其中包含一组用作用户级别设置的属性。每个 属性 都有一个默认值属性。很少有 XmlIgnore 属性来避免序列化。

将此 class 对象序列化为内存流时,它写入正确,但在反序列化时,它实际上创建了一个具有所有属性默认值的对象,该对象不是序列化对象的一部分。我如何忽略少数属性的默认值初始化?提前致谢。

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)

您可能想让它们为空?只是让他们成为可空的道具 例如将 int 转换为 int?

欢迎使用 Whosebug。

关于你如何你de-serializing他们提供的信息很少(代码片段会有所帮助),但我假设你是de-serializing它们变成一个有类型的对象。如果是这样,那么您遇到的是标准行为。这就是默认值的全部要点,你不能“部分de-serialize一个类型对象”。

然而你可以做的是:

  • de-serializing 将对象转换为原始 xmlObject,并为其编写自定义序列化程序。

  • 使属性可以为空,这通常是下面 useful.See 的 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));

然后您可以根据需要和 if 将 DTO 映射回原始对象。您可以手动执行此映射或使用名为 Automapper 的框架。 Automapper 专为映射 DTO 而设计。

如果您需要我澄清任何事情,请告诉我。

编码愉快!