2009-03-03 2 views
3

Я смущен про образец сериализации от MSDN.Вызов GetObjectData при сериализации

Моя путаница в методе GetObjectData (который называется в процессе сериализации), будет метод,

  1. сериализации и дополнительные данные (в методе GetObjectData от AddValue) и поля/свойства класса;
  2. или просто написать данные в методе GetObjectData без ввода полей/свойств класса?

У меня есть отладка кажется (2) правильной - данные полей/свойств не сериализуются, если используется метод GetObjectData? Это верно? (Я не эксперт и просто хочу, чтобы подтвердить здесь, но 100% уверен в себе.)

ответ

2

Если вы реализуете ISerializable, вы reasponsible для всех данные (т.е. сценарий «2» в вашем вопросе); ничего лишнего сериализуется автоматически. Каково ваше требование? Такие вещи, как DataContractSerializer, могут быть основаны на свойствах, позволяя вам украшать как обычные поля , так и ваше пользовательское свойство (имеющее некоторую логику) и правильно их сериализовать. Если вам нужно бинарное (для пробела и т. Д.), То, возможно, рассмотрите такие вещи, как protobuf-net, который смешивает эти два, экономя пространство.

Итак: каковы ваши требования?

Контракт данных Пример:

[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

Или для двоичного с указанным выше вы можете использовать NetDataContractSerializer: http://msdn.microsoft.com/en-us/library/system.runtime.serialization.netdatacontractserializer.aspx –

+0

Спасибо Marc! В чем разница между реализацией интерфейса ISerializable v.s. отметьте атрибут [Serializable]? – George2

+1

Отмечая это как [Serializable], просто говорит: «ОК, чтобы сериализовать это»; большинство механизмов сериализации обнаруживают это и автоматически сериализуют поля (реализация) или свойства (контракты). ISerializable используется BinaryFormatter для ** custom ** serialization, где * вы * управляете двоичным кодом. –

2

Если вы реализуете ISerializable вы должны добавить все данные (по крайней мере, данные, необходимые для десериализации), включая все поля в SerializationInfo с использованием AddValue.

+0

То же самое для реализации интерфейса ISerializable v.s. отметьте атрибут [Serializable]? – George2

+1

Если вы реализуете ISerializable, вы также должны отметить свой класс с помощью [Serializable]. Если вы не хотите добавлять дополнительную информацию в сериализацию, и ваш класс довольно прост, вам не нужно внедрять ISerializable. –

+1

Все, что вам нужно сделать, это отметить [Serializable], и ​​время выполнения сделает всю работу. –

2

Я не уверен, что вы хотите достичь, но не проще позволить C# сделать работу для вас:

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 
    } 
} 

Теперь вы можете использовать XmlSerializer или BinaryFormatter к (де) сериализовать объект

+0

То же самое для реализации интерфейса ISerializable v.s. отметьте атрибут [Serializable]? – George2

+0

От MSDN: «Любой класс, который может быть сериализован, должен быть помечен знаком SerializableAttribute. Если классу необходимо управлять процессом его сериализации, он может реализовать интерфейс ISerializable». Результат тот же, но атрибут делает работу для вас – RvdK

+0

Спасибо PoweRoy, я тестировал, что если пометить атрибутом Serializable, все публичные поля будут сериализованы автоматически, но если оба отмечены Serializable и реализуют интерфейс ISerializable (но делает GetObjectDate пуст), ничего не будет написано. Так странно. Любые комментарии? – George2

Смежные вопросы