2012-04-10 24 views
7

Varsayılan kurucu kullanarak nesne oluşturmayı kısıtlamak istiyorum. Çünkü aşağıdaki gibi bir tasarım var:Varsayılan yapıcı olmadan tasarım

class Program 
{ 
    static void Main(string[] args) 
    { 
     BaseClass bc = new BaseClass("",""); 
     XmlSerializer xml = new XmlSerializer(typeof(BaseClass)); 
     StreamWriter sw = new StreamWriter(File.Create("c:\\test.txt")); 
     xml.Serialize(sw,bc); 
     sw.Flush(); 
     sw.Close(); 
    } 
} 
[Serializable] 
public class BaseClass 
{ 
    public string UserName, Password; 
    // I don't want to create default constructor because of Authentication 
    public BaseClass(string _UserName, string _Password) 
    { 
     UserName = _UserName; 
     Password = _Password; 
     f_Authenticate(); 
    } 
    private void f_Authenticate() { } 
} 

public class DerivedClass:BaseClass 
{ 
    public DerivedClass(string _UserName, string _Password) : base(_UserName, _Password) 
    { 
    } 
} 

Tamam. Ben AnaSınıf yaparken Ama bu hatayı elde edersiniz Serializable'için: Ben Username, Password parametreleri olması gerekir ama varsayılan yapıcı tasarımımı mahvediyor çünkü Unhandled Exception: System.InvalidOperationException: ConsoleApplication1.BaseC lass cannot be serialized because it does not have a parameterless constructor.

Şimdi benim tasarım çöküyor ....

neler yapmalı mıyım?

+0

Aslında her olasılığı öğrenmek istiyorum. Eğer bana neler sunabilirim? – uzay95

+0

http://stackoverflow.com/questions/267724/why-xml-serializable-class-need-a-parameterless-constructor kopyası – Matten

cevap

12

serialzer başarıyla örneklerinizi deserializing özel

+0

Hayır, varsayılan bir kurucu gerektirdiğinden, bu nedenle herkese açık olarak erişilir. –

+1

@TomWijsman Görünüşe göre, Matten'in cevabı hakkındaki yorumları gör – Robbie

+1

Tamamen eksiksiz olmak için, [Sözlü olmayan ("Varsayılan yapıcı sadece serileştirme!" sınıfın içinden. – yoyo

11

sınıf olmasına rağmen bu arayacak özel varsayılan kurucu

private DerivedClass() 
{ 
    // code 
} 

oluştur örneğini oluşturmak için bir parametresiz yapıcı gerektiriyor, ancak yok Bir kamu kurucuyu uygulamak için - hiçbir parametreye ihtiyaç duymadığı sürece private veya internal yapıcısına sahip olmak yeterlidir.

Bu arada, parametresiz bir kurucu gerektirmeyen ve XML de oluşturan DataContractSerializer'u da kullanabilirsiniz; her zaman birincil tercihim :-)

+1

Yansıma – Matten

+0

kullanıyor. Bunun geçerli olacağını bilmiyordum? Kamu kurucusuna ihtiyaç duymasını beklerdim. Bu kesinlikle çalışıyor mu? Eğer öyleyse, havalı! – Liam

+0

@TomWijsmanno, hayır, varsayılan olmayan kurucu (OP'nin örneğindeki) çağırmaktan kastettim, ancak varsayılan yapıcıyı çağıran seri hale getirici olduğunu anladığım için yanıtımı/yorumumu kaldırdım ve bu nedenle özel olamaz (sanırım) – Robbie

1
  • Özel parametresiz bir kurucu oluşturmaya çalıştınız mı? Bir kamu birinin ihtiyacı varsa

  • , her zaman Ayrıca Serializable sınıfındaki özellikleri oluşturmak için gereken

o (değil en iyi çözüm) kullanılmamalıdır söyleyerek comment edebilirsiniz. Serileştirme/deserealizasyon işlemi sırasında değişkenler dikkate alınmaz ve okunmaz veya yazılmayacaktır.