我有一个 xsd 模式,其中有一个类型为 int 的可选元素(
然而,使用
这是基于模式的设计,因此我不能只是向模式中的元素添加“nillable”。
如何将可空的 .NET 类型映射到非 nillable 的 xml 元素?
(我知道可以通过在数据模型中使用 XxxSpecified 属性来在序列化为 xml 时省略 nil 元素,但据我所知,这种方法仍需要向 xsd 模式中添加 nillable。)
编辑:感谢评论,我现在更好地理解了问题。实际上有两个不同的问题:
1. 如果模式元素是 non-nillable(即使它是可选的),则像 xsd.exe 这样的模式到代码生成器会在生成的模型中创建一个 non-nullable 类型。我可以用任何已知的代码生成器覆盖这一点吗,以便在生成的代码中获得可空类型?
2. XmlSerializer 要求数据模型中的可空类型具有
minOccurs=0
,maxOccurs=1
),该元素未定义为 nillable。在数据模型中,我想将其映射到 .NET 类型 Nullable<int>
的字段上,其中 null
值应对应于在 xml 中省略该元素。然而,使用
XmlSerializer
时,似乎我必须在数据模型中声明一个可空的字段,并使用 [XmlElement IsNullable=true]
。如果我设置 IsNullable=false
,则会抛出异常 "IsNullable may not be set to 'false' for a Nullable type." IsNullable may not be set to 'false' for a Nullable type. Consider using 'System.Int32' type or removing the IsNullable property from the XmlElement attribute. "" 但是,如果我理解正确,设置 IsNullable=true
(或忽略该属性)隐含地将元素设置为 nillable,并从而更改模式。这是基于模式的设计,因此我不能只是向模式中的元素添加“nillable”。
如何将可空的 .NET 类型映射到非 nillable 的 xml 元素?
(我知道可以通过在数据模型中使用 XxxSpecified 属性来在序列化为 xml 时省略 nil 元素,但据我所知,这种方法仍需要向 xsd 模式中添加 nillable。)
编辑:感谢评论,我现在更好地理解了问题。实际上有两个不同的问题:
1. 如果模式元素是 non-nillable(即使它是可选的),则像 xsd.exe 这样的模式到代码生成器会在生成的模型中创建一个 non-nullable 类型。我可以用任何已知的代码生成器覆盖这一点吗,以便在生成的代码中获得可空类型?
2. XmlSerializer 要求数据模型中的可空类型具有
[XmlElement IsNullable=true]
,这意味着该模型隐含地向模式添加“nillable”。我能否避免这种情况?