Veri Sözleşmesi Adları
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 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) ad alanına http://schemas.datacontract.org/2004/07/Clr.Namespace
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 için özelliğini DataContractAttributeayarlayınNamespace.
Not
Ad http://schemas.microsoft.com/2003/10/Serialization
alanı ayrılmıştır ve veri sözleşmesi ad alanı olarak kullanılamaz.
Not
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 karma 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" veri sözleşmesi adına sahiptir; burada "5HWGAU6h" "urn:shapes" ve "urn:default" ad alanlarının karmasıdır. Türün Drawing<Square,SpecialRedBrush>
"DrawingOfSquareRedBrushjpB5LgQ_S" veri sözleşmesi adı vardır; burada "jpB5LgQ_S" "urn:shapes" ve "urn:special" ad alanlarının karmasıdır. Karma kullanılmazsa, iki adın aynı olduğunu ve bu nedenle bir ad çakışması oluştuğuna 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, ad çakışmalarıyla karşılaşılmayacağını önceden biliyor ve karmayı kaldırmak isteyebilirsiniz. Bu durumda, ad oluşturmak için farklı bir yol belirtmek için özelliğini kullanabilirsiniz DataContractAttribute.Name . 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.) Karmaya başvurmak için küme ayraçlarının içinde bir sayı (#) işareti kullanabilirsiniz. Bu başvuruların her birini birden çok kez kullanabilir 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. Özelliğinde Name bir "{#}" olduğundan, karmanın adın bir parçası olmadığını ve bu nedenle türün adlandırma çakışmalarına açık olduğunu unutmayın; örneğin, tür Drawing<Square,SpecialRedBrush>
tam olarak aynı veri sözleşmesi adına sahip olur.