序列化可空的枚举wcf

时间:2016-03-04 07:27:05

标签: c# wcf serialization enums xsd

我将我的枚举序列化为可以为空的枚举的问题。我想将枚举设为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”

1 个答案:

答案 0 :(得分:0)

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

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; }
}

这个类,当你执行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,但我已经插入了一个属性&#34;假的&#34;强制XSD生成器根据需要创建XSD。

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