Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Numaralandırmalar veri sözleşmesi modelinde ifade edilebilir. Bu konu başlığında, programlama modelini açıklayan çeşitli örnekler açıklanmaktadır.
Numaralandırma Temelleri
Veri sözleşmesi modelinde numaralandırma türlerini kullanmanın bir yolu, özniteliği türüne DataContractAttribute uygulamaktır. Ardından EnumMemberAttribute özniteliğini veri sözleşmesine dahil edilmesi gereken her bir üyeye uygulamanız gerekir.
Aşağıdaki örnekte iki sınıf gösterilmektedir. İlki sıralamayı kullanır ve ikincisi sıralamayı tanımlar.
[DataContract]
public class Car
{
[DataMember]
public string model;
[DataMember]
public CarConditionEnum condition;
}
[DataContract(Name = "CarCondition")]
public enum CarConditionEnum
{
[EnumMember]
New,
[EnumMember]
Used,
[EnumMember]
Rental,
Broken,
Stolen
}
<DataContract()> _
Public Class Car
<DataMember()> _
Public model As String
<DataMember()> _
Public condition As CarConditionEnum
End Class
<DataContract(Name:="CarCondition")> _
Public Enum CarConditionEnum
<EnumMember> NewCar
<EnumMember> Used
<EnumMember> Rental
Broken
Stolen
End Enum
Bir Car sınıfı örneği, condition alanı New, Used veya Rental değerlerinden birine ayarlandığında gönderilebilir veya alınabilir.
condition
Broken veya Stolen ise, bir SerializationException fırlatılır.
Numaralandırma veri sözleşmeleri için, her zamanki gibi, DataContractAttribute özelliklerini (Name ve Namespace) kullanabilirsiniz.
Numaralandırma Üye Değerleri
Veri sözleşmesi genellikle sayısal değerleri değil numaralandırma üyesi adlarını içerir. Ancak, veri sözleşmesi modelini kullanırken, alıcı taraf bir WCF istemcisiyse, dışarı aktarılan şema sayısal değerleri korur. XmlSerializer Sınıfını Kullanma kullanılırken bu durumun söz konusu olmadığını unutmayın.
Önceki örnekte, conditionUsed olarak ayarlanırsa ve veriler XML olarak serileştirilirse, sonuçta elde edilen XML <condition>Used</condition> olur ve <condition>1</condition> olmaz. Bu nedenle, aşağıdaki veri sözleşmesi, veri sözleşmesine CarConditionEnumeşdeğerdir.
[DataContract(Name = "CarCondition")]
public enum CarConditionWithNumbers
{
[EnumMember]
New = 10,
[EnumMember]
Used = 20,
[EnumMember]
Rental = 30,
}
<DataContract(Name:="CarCondition")> _
Public Enum CarConditionWithNumbers
<EnumMember> NewCar = 10
<EnumMember> Used = 20
<EnumMember> Rental = 30
End Enum
Örneğin, gönderen tarafında CarConditionEnum ve alıcı tarafında CarConditionWithNumbers kullanabilirsiniz. Gönderen taraf için Used "1" değerini, alıcı tarafı ise "20" değerini kullansa da, XML gösterimi her iki taraf için de kullanılır <condition>Used</condition> .
Veri sözleşmesine dahil olmak için özniteliğini EnumMemberAttribute uygulamanız gerekir. .NET Framework'te, her sabit listesi için varsayılan değer olan 0 (sıfır) özel değerini her zaman uygulayabilirsiniz. Ancak, bu özel sıfır değeri bile özniteliğiyle EnumMemberAttribute işaretlenmediği sürece seri hale getirilemez.
Bunun iki özel durumu vardır:
Bayrak numaralandırmaları (bu konunun ilerleyen bölümlerinde tartışılacaktır).
EmitDefaultValue özelliği
falseolarak ayarlanmış numaralandırma veri üyeleri (bu durumda, serileştirilmiş verilerden sıfır değerine sahip numaralandırma atlanır).
Numaralandırma Üyesi Değerlerini Özelleştirme
Veri sözleşmesinin bir parçasını oluşturan numaralandırma üyesi değerini, Value özelliği ve EnumMemberAttribute özniteliğini kullanarak özelleştirebilirsiniz.
Örneğin, aşağıdaki veri sözleşmesi de veri sözleşmesine CarConditionEnumeşdeğerdir.
[DataContract(Name = "CarCondition")]
public enum CarConditionWithDifferentNames
{
[EnumMember(Value = "New")]
BrandNew,
[EnumMember(Value = "Used")]
PreviouslyOwned,
[EnumMember]
Rental
}
<DataContract(Name:="CarCondition")> _
Public Enum CarConditionWithDifferentNames
<EnumMember(Value:="New")> BrandNew
<EnumMember(Value:="Used")> PreviouslyOwned
<EnumMember> Rental
End Enum
Seri hale getirildiğinde, PreviouslyOwned değerinin XML gösterimi <condition>Used</condition> vardır.
Basit Numaralandırmalar
Ayrıca, özniteliğinin DataContractAttribute uygulanmadığı numaralandırma türlerini seri hale getirebilirsiniz. Daha önce açıklandığı gibi, bu tür numaralandırma türleri tam olarak değerlendirilir; ancak, NonSerializedAttribute özniteliği uygulanmamış olan her üye, EnumMemberAttribute özniteliği uygulanmış gibi ele alınır. Örneğin, aşağıdaki sıralı liste, örtük olarak önceki CarConditionEnum örneğe eşdeğer bir veri sözleşmesine sahiptir.
public enum CarCondition
{
New,
Used,
Rental,
[NonSerialized]
Lost
}
Public Enum CarCondition
[New]
Used
Rental
End Enum
Numaralandırmanın veri sözleşmesi adını ve ad alanını ve numaralandırma üyesi değerlerini özelleştirmeniz gerekmediğinde basit numaralandırmaları kullanabilirsiniz.
Basit Numaralandırmalarla ilgili notlar
özniteliğinin EnumMemberAttribute basit numaralandırmalara uygulanmasının hiçbir etkisi yoktur.
Özniteliğin numaralandırmaya SerializableAttribute uygulanıp uygulanmaması fark etmez.
Gerçek şu ki, DataContractSerializer sınıfı, numaralandırma üyelerine uygulanan NonSerializedAttribute özniteliğini kabul etmesiyle, BinaryFormatter ve SoapFormatter davranışlarından farklıdır. Bu serileştiricilerin her ikisi de NonSerializedAttribute özniteliğini görmezden gelir.
Bayrak Numaralandırmaları
Özniteliğini FlagsAttribute numaralandırmalara uygulayabilirsiniz. Bu durumda, sıfır veya daha fazla numaralandırma değerinin listesi aynı anda gönderilebilir veya alınabilir.
Bunu yapmak için, DataContractAttribute özelliğini bayrak numaralandırmasına uygulayın ve ikinin gücü olan tüm üyeleri EnumMemberAttribute özelliğiyle işaretleyin. Bayrak numaralandırması kullanmak için ilerlemenin kesintisiz bir 2 güç dizisi (örneğin, 1, 2, 4, 8, 16, 32, 64) olması gerektiğini unutmayın.
Bayrağın numaralandırma değerini göndermek için aşağıdaki adımlar geçerlidir:
Sayısal değere eşleyen EnumMemberAttribute özniteliği uygulanmış bir numaralandırma üyesini bulmaya çalışın. Bulunursa, yalnızca bu üyeyi içeren bir liste gönderin.
Sayısal değeri, toplamın her bir bölümüne karşılık gelen ve EnumMemberAttribute özniteliği uygulanmış numaralandırma üyeleri olacak şekilde bir toplam olarak bölmeye çalışın. Tüm bu üyelerin listesini gönderin. Doyumsuz algoritmanın böyle bir toplamı bulmak için kullanıldığını ve bu nedenle mevcut olsa bile böyle bir toplamın bulunup bulunmadığının garantisi olmadığını unutmayın. Bu sorunu önlemek için, numaralandırma üyelerinin sayısal değerlerinin iki güç olduğundan emin olun.
Yukarıdaki iki adım başarısız olursa ve sayısal değer sıfır değilse, bir SerializationException atın. Sayısal değer sıfırsa boş listeyi gönderin.
Örnek
Aşağıdaki numaralandırma örneği bir bayrak işleminde kullanılabilir.
[DataContract][Flags]
public enum CarFeatures
{
None = 0,
[EnumMember]
AirConditioner = 1,
[EnumMember]
AutomaticTransmission = 2,
[EnumMember]
PowerDoors = 4,
AlloyWheels = 8,
DeluxePackage = AirConditioner | AutomaticTransmission | PowerDoors | AlloyWheels,
[EnumMember]
CDPlayer = 16,
[EnumMember]
TapePlayer = 32,
MusicPackage = CDPlayer | TapePlayer,
[EnumMember]
Everything = DeluxePackage | MusicPackage
}
<DataContract(), Flags()> _
Public Enum CarFeatures
None = 0
<EnumMember> AirConditioner = 1
<EnumMember> AutomaticTransmission = 2
<EnumMember> PowerDoors = 4
AlloyWheels = 8
DeluxePackage = AirConditioner Or AutomaticTransmission Or PowerDoors Or AlloyWheels
<EnumMember> CDPlayer = 16
<EnumMember> TapePlayer = 32
MusicPackage = CDPlayer Or TapePlayer
<EnumMember> Everything = DeluxePackage Or MusicPackage
End Enum
Aşağıdaki örnek değerler belirtildiği gibi serileştirilir.
CarFeatures cf1 = CarFeatures.AutomaticTransmission;
//Serialized as <cf1>AutomaticTransmission</cf1>
CarFeatures cf2 = (CarFeatures)5;
//Serialized as <cf2>AirConditioner PowerDoors</cf2> since 5=1+4
CarFeatures cf3 = CarFeatures.MusicPackage;
//Serialized as <cf3>CDPlayer TapePlayer</cf3> since MusicPackage itself is not an EnumMember
CarFeatures cf4 = CarFeatures.Everything;
//Serialized as <cf4>Everything</cf4> since Everything itself is an EnumMember
CarFeatures cf5 = CarFeatures.DeluxePackage;
//Throws a SerializationException since neither DeluxePackage nor AlloyWheels are EnumMembers
CarFeatures cf6 = CarFeatures.None;
//Serialized as the empty list <cf6></cf6> since there is no EnumMember mapped to zero
Private cf1 As CarFeatures = CarFeatures.AutomaticTransmission
'Serialized as <cf1>AutomaticTransmission</cf1>
Private cf2 As CarFeatures = ctype(5, CarFeatures)
'Serialized as <cf2>AirConditioner PowerDoors</cf2> since 5=1+4
Private cf3 As CarFeatures = CarFeatures.MusicPackage
'Serialized as <cf3>CDPlayer TapePlayer</cf3> since MusicPackage
' itself is not an EnumMember.
Private cf4 As CarFeatures = CarFeatures.Everything
'Serialized as <cf4>Everything</cf4> since Everything itself is an EnumMember.
Private cf5 As CarFeatures = CarFeatures.DeluxePackage
'Throws a SerializationException since neither DeluxePackage nor
' AlloyWheels are EnumMembers.
Private cf6 As CarFeatures = CarFeatures.None
'Serialized as the empty list <cf6></cf6> since there is no EnumMember mapped to zero.