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 而设计。
如果您需要我澄清任何事情,请告诉我。
编码愉快!
我有一个 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 而设计。
如果您需要我澄清任何事情,请告诉我。
编码愉快!