2009-03-03 31 views
3

MSDN'dan seri hale getirme örneği hakkında kafam karıştı.Seri hale getirme hakkında GetObjectData çağrısı

My kafa karışıklığı, usul (seri sırasında olarak adlandırılır) GetObjectData, olacak bir yöntem olup

  1. serialize her ikisi (AddValue, yöntem GetObjectData olarak) ilave veri ve alanlar/sınıfının özellikleri;
  2. veya sadece sınıfın alanlarını/özelliklerini yazmadan GetObjectData yöntemindeki verileri yazınız mı?

Hata ayıklama var (2) doğru görünüyor - GetObjectData yöntemi kullanılırsa hiçbir alan/özellik verisi serileştirilmiyor? Bu doğru mu? (Kendimi% 100 emin uzmanı değilim ve sadece burada teyit etmek istiyorum, ama.)

cevap

2

Eğer ISerializable uygularsanız, (yani senaryo "2" sorunuzu) Tüm veri için reasponsible vardır; Ekstra hiçbir şey otomatik olarak serileştirilmez. İhtiyacın nedir? DataContractSerializer gibi özellikler, ve düzenli alanlarınızı (bazı mantığa sahip olan) özel alanlarınızı süslemenize ve düzgün şekilde serileştirmenize olanak sağlayan özellik tabanlı olabilir. Eğer ikili alana ihtiyacınız varsa (boşluk vb.), Belki de alan verimli olurken ikisini karıştıran protobuf-net gibi şeyleri düşünün.

Peki: gereksinimleriniz nelerdir?

Veri Sözleşme örneği:

[DataContract] 
public class Foo { 
    [DataMember] 
    public int Bar {get;set;} // simple data 

    [DataMember] 
    private string DoSomeThinking { 
     get {.... serialize the complex data ....} 
     set {.... deserialize the complex data ....} 
    } 
} 
+0

Veya yukarıdaki ile ikili için, NetDataContractSerializer'ı kullanabilirsiniz: http://msdn.microsoft.com/en-us/library/system.runtime.serialization.netdatacontractserializer.aspx –

+0

Teşekkürler Marc! ISerializable interface v.s.'nin uygulanması arasındaki farklar nelerdir? [Serializable] özelliğiyle işaretle? – George2

+1

[Serializable] olarak işaretlemek, "bunu seri hale getirmenin tamam olduğunu" söylüyor; çoğu serileştirme motoru bunu algılar ve alanları (uygulama) veya özellikleri (sözleşmeler) otomatik olarak serileştirir. ISerializable, BinaryFormatter tarafından ** özel ** serileştirme için kullanılır, burada * siz ikilileri kontrol edersiniz. –

2

Eğer tüm verileri eklemelisiniz ISerializable uygularsanız AddValue kullanarak SerializationInfo tüm alanlar dahil olmak üzere (serisini gerekli veriler en azından). ulaşmak istediğiniz ama C# sizin için çalışma yapalım daha kolay değil ne

+0

ISerializable arabirimini v.s. [Serializable] özelliğiyle işaretle? – George2

+1

ISerializable'ı uygularsanız, sınıfınızı [Serializable] ile işaretlemeniz gerekir. Serileştirmeye fazladan bilgi eklemek istemezseniz ve sınıfınız oldukça basitse, ISerializable'ı uygulamak zorunda değilsiniz. –

+1

Tek yapmanız gereken [Seri hale getirilebilir] ile işaretlemek ve çalışma zamanı tüm işi yapacak. –

2

Im emin değil:

using System; 
using System.Collections.Generic; 
using System.Xml.Serialization; 

namespace Test 
{ 
    [Serializable] 
    public class TestObject 
    { 
     private String name; 
     private String note; 
     #region Getters/setters 

     public String Name 
     { 
      get { return name; } 
      set { name = value; } 
     } 

     public String Note 
     { 
      get { return note; } 
      set { note = value; } 
     } 
     #endregion 
    } 
} 

Şimdi kullanabilirsiniz için XmlSerializer'ı veya BinaryFormatter (de) nesne seri

+0

ISerializable arabirimini v.s. [Serializable] özelliğiyle işaretle? MSDN – George2

+0

: "SerializableAttribute ile işaretlenmiş olmalıdır serileştirilebilir olabilecek her sınıftan bir sınıf serileştirme işlemi kontrol etmek gerekiyorsa, ISerializable arabirimi uygulayabilir." sonuç aynıdır ancak nitelik sizin için çalışır – RvdK

+0

Teşekkür PoweRoy, ben Serializable özniteliği ile işaretlenmiş ise, tüm kamu alanları otomatik serileştirilebilir olacağını test ettik, ancak her iki Serializable ile işaretlenmiş ve eğer ıserializable arabirimini uygulayan (ama markaları GetObjectDate boş), hiçbir şey yazılmayacak. Çok garip. Herhangi bir yorum? – George2

İlgili konular