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.
Bazen istemci ve hizmet aynı türleri paylaşmaz. Veri sözleşmeleri her iki tarafta da eşdeğer olduğu sürece verileri birbirine geçirmeye devam edebilir. Veri Sözleşmesi Denkliği , veri sözleşmesi ve veri üyesi adlarını temel alır ve bu nedenle türleri ve üyeleri bu adlarla eşlemek için bir mekanizma sağlanır. Bu konuda, veri sözleşmelerini adlandırma kurallarının yanı sıra ad oluştururken Windows Communication Foundation (WCF) altyapısının varsayılan davranışı açıklanmaktadır.
Temel Kurallar
Veri sözleşmelerini adlandırmayla ilgili temel kurallar şunlardır:
Tam nitelikli veri sözleşmesi adı, bir ad alanı ve bir addan oluşur.
Veri üyelerinin yalnızca adları vardır, ancak ad alanı yoktur.
Veri sözleşmeleri işlenirken WCF altyapısı hem ad alanlarına hem de veri sözleşmelerinin ve veri üyelerinin adlarına duyarlıdır.
Veri Sözleşmesi Ad Alanları
Veri sözleşmesi ad alanı Tekdüzen Kaynak Tanımlayıcısı (URI) biçimindedir. URI mutlak veya göreli olabilir. Varsayılan olarak, belirli bir tür için veri sözleşmelerine bu türdeki ortak dil çalışma zamanı (CLR) ad alanından gelen bir ad alanı atanır.
Varsayılan olarak, belirli bir CLR ad alanı (Clr.Namespace biçiminde) http://schemas.datacontract.org/2004/07/Clr.Namespace ad alanına eşlenir. Bu varsayılanı geçersiz kılmak için özniteliğini modülün ContractNamespaceAttribute veya derlemenin tamamına uygulayın. Alternatif olarak, her tür için veri sözleşmesi ad alanını denetlemek amacıyla Namespace özelliğini DataContractAttribute olarak ayarlayın.
Uyarı
http://schemas.microsoft.com/2003/10/Serialization ad alanı ayrılmıştır ve veri sözleşmesi ad alanı olarak kullanılması yasaktır.
Uyarı
Bildirim içeren delegate veri sözleşmesi türlerinde varsayılan ad alanını geçersiz kılamazsınız.
Veri Sözleşmesi Adları
Belirli bir tür için veri sözleşmesinin varsayılan adı, bu türün adıdır. Varsayılanı geçersiz kılmak için öğesinin NameDataContractAttribute özelliğini alternatif bir ad olarak ayarlayın. Genel türler için özel kurallar, bu konunun devamında yer alan "Genel Türler için Veri Sözleşmesi Adları" bölümünde açıklanmıştır.
Veri Üyesi Adları
Belirli bir alan veya özellik için veri üyesinin varsayılan adı, söz konusu alanın veya özelliğin adıdır. Varsayılanı geçersiz kılmak için öğesinin NameDataMemberAttribute özelliğini alternatif bir değere ayarlayın.
Örnekler
Aşağıdaki örnek, veri sözleşmelerinin ve veri üyelerinin varsayılan adlandırma davranışını nasıl geçersiz kılabileceğinizi gösterir.
// This overrides the standard namespace mapping for all contracts
// in Contoso.CRM.
[assembly: ContractNamespace("http://schemas.example.com/crm",
ClrNamespace = "Contoso.CRM")]
namespace Contoso.CRM
{
// The namespace is overridden to become:
// http://schemas.example.com/crm.
// But the name is the default "Customer".
[DataContract]
public class Customer
{
// Code not shown.
}
}
namespace Contoso.OrderProc
{
[DataContract]
public class PurchaseOrder
{
// This data member is named "Amount" by default.
[DataMember]
public double Amount;
// The default is overridden to become "Address".
[DataMember(Name = "Address")]
public string Ship_to;
}
// The namespace is the default value:
// http://schemas.datacontract.org/2004/07/Contoso.OrderProc
// The name is "PurchaseOrder" instead of "MyInvoice".
[DataContract(Name = "PurchaseOrder")]
public class MyInvoice
{
// Code not shown.
}
// The contract name is "Payment" instead of "MyPayment"
// and the Namespace is "http://schemas.example.com" instead
// of the default.
[DataContract(Name = "Payment",
Namespace = "http://schemas.example.com")]
public class MyPayment
{
// Code not shown.
}
}
' This overrides the standard namespace mapping for all contracts
' in Contoso.CRM.
<Assembly: ContractNamespace("http://schemas.example.com/crm", _
ClrNamespace:="Contoso.CRM")>
Namespace Contoso.CRM
' The namespace is overridden to become:
' http://schemas.example.com/crm.
' But the name is the default "Customer".
<DataContract()> _
Public Class Customer
' Code not shown.
End Class
End Namespace
Namespace Contoso.OrderProc
<DataContract()> _
Public Class PurchaseOrder
' This data member is named "Amount" by default.
<DataMember()> _
Public Amount As Double
' The default is overridden to become "Address".
<DataMember(Name:="Address")> _
Public Ship_to As String
End Class
' The namespace is the default value:
' http://schemas.datacontract.org/2004/07/Contoso.OrderProc
' The name is "PurchaseOrder" instead of "MyInvoice".
<DataContract(Name:="PurchaseOrder")> _
Public Class MyInvoice
' Code not shown.
End Class
' The contract name is "Payment" instead of "MyPayment"
' and the Namespace is "http://schemas.example.com" instead
' of the default.
<DataContract(Name:="Payment", [Namespace]:="http://schemas.example.com")> _
Public Class MyPayment
' Code not shown.
End Class
End Namespace
Genel Türler için Veri Sözleşmesi Adları
Genel türler için veri sözleşmesi adlarını belirlemek için özel kurallar vardır. Bu kurallar, aynı genel türdeki iki kapalı genel öğe arasındaki veri sözleşmesi adı çakışmalarını önlemeye yardımcı olur.
Varsayılan olarak, genel bir türün veri sözleşmesi adı türün adıdır ve ardından "Of" dizesi, ardından genel parametrelerin veri sözleşmesi adları ve ardından genel parametrelerin veri sözleşmesi ad alanları kullanılarak hesaplanan bir karma gelir. Karma, bir veri parçasını benzersiz olarak tanımlayan bir "parmak izi" işlevi gören matematiksel bir işlevin sonucudur. Tüm genel parametreler ilkel türler olduğunda hash atlanır.
Örneğin, aşağıdaki örnekteki türlere bakın.
[DataContract]
public class Drawing<Shape, Brush>
{
// Code not shown.
}
[DataContract(Namespace = "urn:shapes")]
public class Square
{
// Code not shown.
}
[DataContract(Name = "RedBrush", Namespace = "urn:default")]
public class RegularRedBrush
{
// Code not shown.
}
[DataContract(Name = "RedBrush", Namespace = "urn:special")]
public class SpecialRedBrush
{
// Code not shown.
}
<DataContract()> _
Public Class Drawing(Of Shape, Brush)
<DataContract([Namespace]:="urn:shapes")> _
Public Class Square
' Code not shown.
End Class
<DataContract(Name:="RedBrush", [Namespace]:="urn:default")> _
Public Class RegularRedBrush
' Code not shown.
End Class
<DataContract(Name:="RedBrush", [Namespace]:="urn:special")> _
Public Class SpecialRedBrush
' Code not shown.
End Class
End Class
Bu örnekte, tür Drawing<Square,RegularRedBrush>, "DrawingOfSquareRedBrush5HWGAU6h" adlı veri sözleşmesiyle bağlantılıdır; burada "5HWGAU6h", "urn:shapes" ve "urn:default" ad alanlarının karmasıdır.
Drawing<Square,SpecialRedBrush> türünün veri sözleşmesi adı "DrawingOfSquareRedBrushjpB5LgQ_S"dir ve burada "jpB5LgQ_S", "urn:shapes" ve "urn:special" ad alanlarının karmasından türetilmiştir. Hash kullanılmadığında, iki ismin aynı olduğu ve bu nedenle bir isim çakışması meydana geldiğine dikkat edin.
Genel türler için veri sözleşmesi adlarını özelleştirme
Bazen, daha önce açıklandığı gibi genel türler için oluşturulan veri sözleşmesi adları kabul edilemez. Örneğin, isim çakışmalarıyla karşılaşmayacağınızı önceden biliyor olabilir ve hash'i kaldırmak isteyebilirsiniz. Bu durumda, adları farklı bir şekilde oluşturmak için DataContractAttribute.Name özelliğini kullanabilirsiniz. Genel parametrelerin veri sözleşmesi adlarına başvurmak için özelliğin Name içindeki küme ayraçlarındaki sayıları kullanabilirsiniz. (0 ilk parametreye, 1 ikinci parametreye başvurur vb.) Karma değerine atıfta bulunmak için küme ayraçlarının içinde bir sayı (#) işareti kullanabilirsiniz. Bu referansların her birini birden çok kez veya hiç kullanmayabilirsiniz.
Örneğin, yukarıdaki genel Drawing tür aşağıdaki örnekte gösterildiği gibi bildirilmiş olabilir.
[DataContract(Name = "Drawing_using_{1}_brush_and_{0}_shape")]
public class Drawing<Shape, Brush>
{
// Code not shown.
}
<DataContract(Name:="Drawing_using_{1}_brush_and_{0}_shape")> _
Public Class Drawing(Of Shape, Brush)
' Code not shown.
End Class
Bu durumda, türü Drawing<Square,RegularRedBrush> "Drawing_using_RedBrush_brush_and_Square_shape" veri sözleşmesi adına sahiptir. Özellikte bir "{#}" olduğu için Name karma değeri adın bir parçası değildir ve bu nedenle tür adlandırma çakışmalarına açıktır; örneğin, tür Drawing<Square,SpecialRedBrush> tam olarak aynı veri sözleşmesi adına sahip olur.