2009-03-02 22 views
1

DÜZENLEME DAHİLDİR: Sorunumun çözümü IXMLSerializer'ı uygulamaktır. Hızlı yanıtlar için herkese teşekkürler.ISerialization Constructor,

Herkese merhaba, Bu sorunu yaşıyorum ve buna uygun bir çözüm bulmuyorum.

Aşağıdaki sınıf var

ben

serializer.Deserialize(new StringReader("<?xml version="1.0" encoding="utf-16"?><Test><Id>0</Id><ChildId>10</ChildId></Test>"); 

serisini aşağıdaki kodu kullanarak

<?xml version="1.0" encoding="utf-16"?><Test><Id>0</Id><ChildId>10</ChildId></Test> 

deserialzed edilecek aşağıdaki XML gönderirseniz ben sözde

public class Child 
     { 
      private int _id; 

      public int Id 
      { 
       get { return _id; } 
       set { _id = value; } 
      } 

     } 
     [Serializable] 
     public class Test: ISerializable 
     { 
      private int _id; 

      public int Id 
      { 
       get { return _id; } 
       set { _id = value; } 
      } 

      private Child _child = new Child(); 

      public Child Child 
      { 
       get { return _child; } 
       set { _child = value; } 
      } 

      public Test() 
      { 
      } 
      protected Test(SerializationInfo info, StreamingContext context) 
      { 
       if (info.MemberCount > 1) 
        Child.Id = info.GetInt32("ChildId"); 
      } 


      #region ISerializable Members 

      public void GetObjectData(SerializationInfo info, StreamingContext context) 
      { 
       info.AddValue("ChildId", Child.Id); 
      } 

      #endregion 
     } 

derim Benim serileştirme kurucum, ama şey hiç çağrılmadı.

ben yerine yukarıda yayınlanan XML kullanıyorum bu

<?xml version="1.0" encoding="utf-16"?><Test><Id>0</Id><Child><Id>10</Id></Child></Test> 
ben başka bir uygulamadan yayınlanan xml alıyorum Çünkü

, bu yüzden elle alt nesneler oluşturulur ve içinden elle değerini tayin gerekir yapıcı.

Bana sağlayabileceğiniz tüm yardım ve rehberliği gerçekten takdir edeceğim.

cevap

7

XML serileştirmesini özelleştirmek için ISerializable yerine IXmlSerializable kullanmanız gerektiğine inanıyorum.

Bence bu, parametresiz bir kurucu gerektirir ve ReadXml ve WriteXml'u uygulamanız gerekir. Diğer bir deyişle, aynı yapıcıyı ikili serileştirme olarak kullanmaz.

3

Kullandığınız serializer değişkeni nedir? Bir XmlSerializer ise, serileştirme kancalarınız çağrılmayacaktır çünkü XmlSerializer bunları desteklememektedir (bkz. IXmlSerializable).

+0

Bir XmlSerializer kullanıyorum, ancak seri hale getirme sırasında Serileştirme kurucusunun çağrılmasına rağmen. – Paleta

+0

Hangi seri hale getirici kullanmalıyım? – Paleta

2

XmlSerializer, SerializableAttribute, ISerializable veya SerializationInfo bilgileri ve StreamingContext parametrelerini alan yapıcı kullanmaz. Bu yapılar, serileştirme için SoapFormatter (eski) ve BinaryFormatter kullanıldığında kullanılır.

 BinaryFormatter bf = new BinaryFormatter(); 
     using (MemoryStream ms = new MemoryStream()) 
     { 
      Class1 c1 = new Class1(); 
      bf.Serialize(ms, c1); 

      ms.Position = 0; 
      Class1 c2 = bf.Deserialize(ms) as Class1; 
     } 
+0

Bir İkili Biçimlendirici ile birlikte bir MemoryStream kullanmaya çalışıyorum ve XML'yi MemoryStream içine yazmaya çalışıyorum ancak bu hatayı alıyorum: "System.ArgumentException: Akış okunamadı." Burada gerçekten kayboldum, akış BinaryFormatting – Paleta

+0

ile okuma için mevcut olmalıdır Cevabım için bazı kod ekledim. Benim için çalışıyor. –

+0

Tamam, ancak gönderdiğiniz durumda, bir XML alıyorum ve onu bir Sınıf içine serileştirmek istiyorum. BinaryFormatter'ı kullanarak bunu nasıl yapacağım? – Paleta

İlgili konular