2016-03-04 77 views
1

我有問題,我的枚舉序列化爲可空枚舉。我想使枚舉作爲一個minOccurs可爲空= 0序列化可空枚舉wcf

這裏是我的枚舉:

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」

+0

問題是什麼?除「我有問題」之外。 – Adimeus

+0

查看我更新的帖子。 – Cieja

+0

這是en枚舉定義,枚舉永遠不會爲空,但具有該類型的屬性可以聲明爲可爲空。 (經典的例子就像public int?Value {get; set;})你是如何聲明屬性的? –

回答

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,但我插入了一個屬性「假」來強制XSD生成器根據需要創建XSD。

我認爲,如果XSD.exe生成器不符合您的要求,您需要自行定製或手動創建XSD。之後,您可以在您的對象上實現IXmlSerializer方法,這樣您就可以完全控制反序列化和XML解析