序列化可为 null 的枚举 wcf

Serialize nullable enum wcf

我在将我的枚举序列化为可为 null 的枚举时遇到问题。我想使用 minoccurs = 0.

将枚举设为可空

这是我的枚举:

public enum TestEnum
{
    val_1= 0,
    val_2 = 1,
    val_3 = 2,
    val_4 = 3
}

我试过将序列化为字符串或使用 "spefified" 标志,但它仅用于布尔值。

所以最后我想得到 xsd 这样的:

<element minOccurs="0" maxOccurs="1" name="TestEnum" type="TestEnum"/>

我总是得到 minOccurs="1"

我不喜欢这个解决方案,但我找到了解决方法

public enum MyEnum
{
    Val1,
    Val2,
}

public class TestDefine
{
    public string MyEnumPropSerialize
    {
        get
        {
            if (MyEnumProp.HasValue)
            {
                return MyEnumProp.ToString();
            }
            return null;
        }
        set
        {
            MyEnum importValue;
            if (Enum.TryParse<MyEnum>(value, out importValue))
            {
                MyEnumProp = importValue;
            }else
            {
                MyEnumProp.ToString();
            }
        }
    }

    [XmlIgnore]
    public MyEnum? MyEnumProp { get; set; }
}

这个class,当你执行xsd.exe创建这个xsd定义

<?xml version="1.0" encoding="utf-8"?>
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="TestDefine" nillable="true" type="TestDefine" />
  <xs:complexType name="TestDefine">
    <xs:sequence>
      <xs:element minOccurs="0" maxOccurs="1" name="MyEnumPropSerialize" type="xs:string" />
    </xs:sequence>
  </xs:complexType>
</xs:schema>

它是正确的 XSD 但我插入了一个 属性 "fake" 来强制 XSD 生成器创建你想要的 XSD。

我认为如果 XSD.exe 生成器不满足您的要求,您需要自行自定义或手动创建 XSD。之后,您可以在对象上实现 IXmlSerializer 方法,这样您就可以完全控制反序列化和 XML 解析