2009-08-27 2 views
14

WCF'yi her kullandığımda, her zaman telin üzerinden geçen (yani kurucuda ayarlanan parametreler, salt okunur) sonlanan değişmez sınıflar yapmayı denerim. Bununla birlikte, bu, tüm özelliklerin Public get/set olmasını gerektiren WCF serileştirme sürecine girer (bu da mantıklıdır, çünkü bunları deserialize eder)WCF DataContract salt okunur özelliklerin serileştirilmesi?

this related post bile, onların çözümlerinin herşeyi çözdüğünü görüyorum. Kamu, iyi programlama anlayışımı ihlal ediyor. Bunun etrafında bir yolu var mı? Bu çözümü ya da buzlu şeker değişmezliği gibi bir şey için yerleşmek ve onunla mutlu olmak zorunda mıyım? Eğer DataContractSerializer (kullanırsanız hangi

/// <summary> 
/// This represents a discovered virtual-machine template that can be 
/// instantiated into a RunningVirtualMachine 
/// </summary> 
[DataContract] 
[XmlRoot("VMTemplate")] 
public class VirtualMachineTemplateBase 
{ 
    [DataMember] 
    public virtual ulong SizeInBytes { get; set; } 
} 

/// <summary> 
/// This class is the real guts of VirtualMachineTemplate that we're hiding 
/// from the base class. 
/// </summary> 
[XmlInclude(typeof(VirtualMachineTemplateBase))] 
public class VirtualMachineTemplate : VirtualMachineTemplateBase, IXmlPicklable, IEnableLogger 
{ 
    ulong _SizeInBytes; 
    public override ulong SizeInBytes { 
     get { return _SizeInBytes; } 
     set { } 
    } 
} 

cevap

15

:

Denedim diğer şey her şey için bir temel sınıf ve yararsız set yapılmış bir türetilmiş sınıf olurdu nerede bu gibi bir şeydi

[DataContract] 
public class VirtualMachineTemplate : VirtualMachineTemplateBase, IXmlPicklable, IEnableLogger 
{ 
    [DataMember] 
    ulong _SizeInBytes; 
} 

Ama DataContractSerializer kullanmak gerekir - değil XML seri hale: hatta bir salt okunur bir alandır - WCF için varsayılan), sen [DataMember] özniteliği ile dekore anyhting serileştirebilirsiniz. XML serializer SADECE kamusal özellikleri serileştirebilir (ve bir [XmlIgnore] koymadıkça).

DataContractSerializer farklıdır: bir parametre daha az varsayılan kurucuyu gerekmez

  • o olacak sadece serialize açıkça [DataMember]
  • ile işaretlemek ama bu şey ne olabilir - bir alan bir özellik ve herhangi bir görünürlük (kamu, korumalı, özel)
  • biraz daha hızlı XmlSerializer daha, ama XML şekli üzerinde geniş bir denetim alamadım - Yalnızca

bu blog post bakın nelerin dahil söz ve daha ipuçları birkaç için bu blog post olsun. Marc

+12

Hayır, yine de kümeyi eklemeniz gerekir veya başarısız olur. – Craig

+0

SerializeReadOnlyTypes'i DataContractSerializerSettings'de true olarak ayarlayabilirsiniz. –

+0

Av, blog yazısı bağlantıları petethepagan-gerbil @ ölü şimdi :( –

3

deserialization hizmet etmek özellik için özel ayarlayıcı eklemek aynı anda immutability ve kolayca uygulanmasını hem sağlamak. Kaputun altında çok şey oluyor ama işe yarıyor.