2009-03-08 18 views
5

WCF'yi öğrenmeye çalışmanın bir parçası olarak, seri hale getirmeyi okuyorum. .NET 3.5'de seriyi nasıl denetleyebileceğimi anlamaya çalışıyorum. Mesela, birkaç kamu mülküyle basit bir sınıfa sahibim. DataContract özniteliğini bu sınıfa ekleyerek, örneğin serileştirildiğinden, ad alanını ve sınıfın adını denetleyebilirim.DataContract ve XmlType

Diğer taraftan, Serializable özniteliğini (muhtemelen gerekli değil) ve bir XmlType özniteliğini ekleyebilirim; bu, aynı zamanda, ad alanını ve sınıfa serileştirmek için kullanılan adı denetlememe de olanak tanır.

Her iki yöntemi de uyguladım ve sınıfı bir ServiceContract'ta bir arabirim çağrısının parçası olarak kullanıyorum. Daha sonra çeşitli nesnelerin nasıl serileştirildiğini görmek için bir Http analizcisi kullanıyorum ve XmlType'ın http içinde hiç xml'yi etkilemediğini fark ettim.

Bütün gün bunu anlamaya çalışıyorum. Neyi kaçırıyorum?

Güncelleme: İki arasındaki farkı ve neden orada olduklarını anlıyorum. Ben sadece neden xmlType ile oluşturulan xml etkileyemiyorum veya (sadece XmlRoot denedim) anlamıyorum.

Temel olarak, ad ve üst düzey eleman ismi hariç IXmlSerializable uygulayarak serileştirme tüm ayrıntılarını kontrol edebilirsiniz. Bunun için XmlType veya XmlRoot özniteliğine ihtiyacınız olacağını varsayıyordum. Hatalı mıydım?

+1

XmlRoot, XmlType ve IXmlSerializable, XML Serializer ile ilgilidir ve veri sözleşmesi serileştirme üzerinde hiçbir etkisi yoktur. –

+0

Bkz. [Datacontractserializer-vs-xmlserializer-pros-and-cons?] (Http://stackoverflow.com/questions/2505778/datacontractserializer-vs-xmlserializer-pros-and-cons-of-each-serializer?) – nawfal

cevap

1

Bkz. XmlSerializer vs DataContractSerializer: Serialization in Wcf.

Düzenleme:

Customize your .NET object XML serialization with .NET XML attributes bakınız. Verilerinizi önce istediğiniz forma serileştirin. Sonra XmlSerializerFormat özniteliği koyun. DataContractSerializer ait

[ServiceContract] 
[XmlSerializerFormat] 
public interface MyService 
{ 
    [OperationContract] 
    [XmlSerializerFormat] 
    void MyMethod(); 
} 
+0

I Bu makaleyi bugün okudu, ancak XmlType özniteliğinden hiç bahsetmiyor. Adı ve ad alanını değiştirmek için XmlRoot özniteliğini kullanabileceğinizi söylüyor, ancak bunu da yapamam. – Bernie

5

ana nokta için serileştirme ayrıntılarını kontrol değildir. Bunun yerine, fikir, verilerinizi en fazla sayıda müşteri tarafından tüketilebilecek bir form haline getirmektir. Bunun yerine şemanın ayrıntıları ile ilgili olma

bir gönderilip alınmasına veri üyeleri açısından bir veri sözleşme tanımlar. Verilerin çok soyut bir tanımıdır. Soyut açıklamayı yansıtan çok basit bir formatta serileştirilmiştir. Kesinlikle serileştirilebilir veya seriden çıkarılabilir XML detaylar üzerinde kontrol gerektiren durumlarda

XML seri

sadece kullanılmalıdır. Bu kadar kontrole ihtiyacınız olmadığında Data Contract Serializer ile yapıştırın. DataContractSerializer ve XmlSerializer üzerinde çok sayıda karşılaştırma var.

0

ben vardır bence ana noktaları tahmin:

  • DataContract olan "opt-in" - açıkça herhangi bir alan veya mülke (kamu, özel, iç bir [DataMember] öznitelik eklemek gerekir ya da her neyse) serileştirmek için - eğer sahip değilseniz, o orada olmayacak.XmlSerializer sadece tüm kamu özellikleri

  • serialize
  • DataContract veri elemanlarının belirli bir düzen belirlemenizi sağlar - XmlSerializer sadece

  • XmlSerializer bir halkı gerektirir onlar kaynak kodunda görünme sırasını kullanıyor, parametresi olmayan basit örneklerde sınıfınızın

için yapıcı, DataContractSerializer bu avantajları gerçekten çok gibi görünmeyebilir - ama veri nesnesi yoksa daha büyük ölçekli uygulamalarda ayrı bir avantaj olabilir, genel parametresiz bir kurucuya sahip olmak zorundadır ve yalnızca serileştirme içerisine dahil etmek için "yapay olarak" yüzey öğelerine sahip olmanız gerekmez.

Marc açıklığa kavuşturmak

2

Noktası: [Serializable] özniteliği XmlSerialization ile ilgisi yoktur. [Serializable] niteliğinin Runtime.Serialization ile ilgisi vardır. Kafa karıştırıcı, evet.

.NET'te çok fazla seri çoğaltıcı var.

İlgili konular