2014-12-04 6 views
2
[Serializable] 
class DOThis 
{ 
    private string _name; 

    public string Name 
    { 
     get { return _name; } 
     set { _name = value; } 
    } 

    public string Value 
    { 
     get 
     { 
      if (_name == "Hi") 
       return "Hey Hi"; 
      else 
       return "Sorry I dont know you"; 
     } 
    } 
} 

У меня есть класс выше, который будет сериализован с использованием BinaryFormatter. Ниже приведен код сериализации,Как игнорировать свойство из сериализации с помощью BinaryFormatter?

DOThis obj = new DOThis(); 
obj.Name = "Ho"; 
BinaryFormatter bfm = new BinaryFormatter(); 
MemoryStream ms = new MemoryStream(); 
bfm.Serialize(ms, obj); 

Вот как игнорировать свойство «Value» от сериализовано, а также в десериализации, так как я всегда может получить свойство «Value», используя свойство «Name»?

+1

Не является прямым ответом на ваш вопрос, но вы считали Protobuf? Я заметил, что protobuf * путь * быстрее, чем BinaryFormatter в моих перфекционных тестах. – code4life

+0

Я отредактировал ваш заголовок. Пожалуйста, смотрите: «Если вопросы включают« теги »в их названиях?] (Http://meta.stackexchange.com/questions/19190/), где консенсус« нет, они не должны ». –

ответ

5

Вам не нужно вносить какие-либо изменения в код: BinaryFormatter только упорядочивает поля, а не свойства, поэтому он не будет сериализовать Value.

Вот шестнадцатеричный дамп полученного MemoryStream, который показывает, что только «_name» и «Хо» упорядочиваются:

00 01 00 00 00 FF FF FF FF 01 00 00 00 00 00 00 .....ÿÿÿÿ....... 
00 0C 02 00 00 00 3B 44 65 6D 6F 2C 20 56 65 72 ......;Demo, Ver 
73 69 6F 6E 3D 31 2E 30 2E 30 2E 30 2C 20 43 75 sion=1.0.0.0, Cu 
6C 74 75 72 65 3D 6E 65 75 74 72 61 6C 2C 20 50 lture=neutral, P 
75 62 6C 69 63 4B 65 79 54 6F 6B 65 6E 3D 6E 75 ublicKeyToken=nu 
6C 6C 05 01 00 00 00 0B 44 65 6D 6F 2E 44 4F 54 ll......Demo.DOT 
68 69 73 01 00 00 00 05 5F 6E 61 6D 65 01 02 00 his....._name... 
00 00 06 03 00 00 00 02 48 6F 0B     ........Ho. 
-3

Посмотрите на NonSerializedAttribute.

[Serializable] 
class DOThis 
{ 
    private string _name; 

    public string Name 
    { 
     get { return _name; } 
     set { _name = value; } 
    } 

    [NonSerialized()] 
    public string Value 
    { 
     get 
     { 
      if (_name == "Hi") 
       return "Hey Hi"; 
      else 
       return "Sorry I dont know you"; 
     } 
    } 
} 
+5

Это неправильно. 'NonSerialized' может помещаться только на поля, а не на свойства. Правильный ответ заключается в том, что 'BinaryFormatter' * уже * игнорирует' Value'; он только сериализует поля. –

+1

Михаил прав. У меня был мозговой пердит. –