Перечисления сериализуются по умолчанию.Как и примитивы и классы Collection, вам не нужно отмечать их [DataContract].Однако это не означает, что WCF не позволяет настраивать поведение сериализации, поэтому в духе взаимодействия вы можете изменить способ сериализации перечисления.Как часть этой настраиваемости, если вы помечаете его с помощью DataContract, но не помечаете EnumMembers, вы меняете схему сериализации по умолчанию.Подробнее о сериализации Enum читайте здесь Сериализация Enum
РЕДАКТИРОВАТЬ: Задумался об этом немного больше, и теперь я начал задумываться об основной причине ... оказывается, это вина WSDL.
По умолчанию, если вы не поставите [DataContract], WCF по умолчанию сериализует перечисление, как если бы оно имело атрибуты [DataContract] и [EnumMembers].Поэтому, если вы возьмете следующий пример
[DataContract]
public enum FileType {
[EnumMember]
Text,
[EnumMember]
Pdf,
[EnumMember]
Word
}
, он сгенерирует следующий WSDL
<xs:simpleType name="FileType">
<xs:restriction base="xs:string">
<xs:enumeration value="Text" />
<xs:enumeration value="Pdf" />
<xs:enumeration value="Word" />
</xs:restriction>
</xs:simpleType>
<xs:element name="FileType" nillable="true" type="tns:FileType" />
Так что теперь, если вы уберете атрибуты [EnumMember], например,
[DataContract]
public enum FileType {
Text,
Pdf,
Word
}
ваш WSDL будет выглядеть следующим образом:
<xs:simpleType name="FileType">
<xs:restriction base="xs:string" />
</xs:simpleType>
<xs:element name="FileType" nillable="true" type="tns:FileType" />
Таким образом, второй выглядит так же, как и первый, за исключением элементов перечисления.Теперь, в чем разница между вторым и просто WSDL, описывающим простую строку?Никто.Вот почему ген прокси WCF дает вам строку вместо Enum.