我已经阅读了许多关于可空字段反序列化的帖子,但没有遇到以下情况:
- 使用包含值的可为空字段序列化对象(“nil”属性不会添加到节点,因为它包含值)。
- 从 xml 中的可为空字段中删除值(这通过客户端处理发生)。
- 反序列化 xml。
第 3 步会抛出错误,因为序列化程序不会将可空字段的空值视为空值(因为未指定“nil=true”)。相反,它会尝试将值转换为字段的数据类型(例如:Guid),但失败会导致错误消息因字段的数据类型而异。
在 Guid 的情况下,错误消息是:
System.InvalidOperationException: There is an error in XML document ([line number], [column number]). ---> System.FormatException: Unrecognized Guid format.
我应该注意,我们使用的序列化/反序列化方法是使用泛型的框架方法。
我正在寻找一个优雅而通用的解决方案。我能想到的唯一可行的通用解决方案如下:
- 将 xml 转换为 XDocument。
- 使用(少于期望的)反射来获取对象的所有引用类型的属性。
- 将“nil=true”属性添加到名称在 #2 的列表中找到且值为空的所有节点。
- 使用递归处理#2 中的每个引用类型。
注意:简单地向所有具有空值的节点添加“nil=true”是行不通的,因为序列化程序会为不能为空的值类型抛出错误。
[编辑] 代码示例:
样本数据类
public class DummyData
{
public Guid? NullableGuid { get; set; }
}
发送给客户端的 XML
<DummyData>
<NullableGuid>052ec82c-7322-4745-9ac1-20cc4e0f142d</NullableGuid>
</DummyData>
从客户端返回的 XML(错误)
<DummyData>
<NullableGuid></NullableGuid>
</DummyData>
从客户端返回的 XML(期望的结果)
<DummyData>
<NullableGuid p2:nil="true" xmlns:p2="http://www.w3.org/2001/XMLSchema-instance"></NullableGuid>
</DummyData>