2014-12-04 99 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); 

这里如何从被序列以及在反序列化忽略属性“值”,因为我可以随时检索使用“名称”属性“值”属性?

+1

不是直接回答你的问题,但你有没有考虑protobuf的?我注意到在我的性能测试中,protobuf比* BinaryFormatter更快。 – code4life 2014-12-04 04:01:48

+0

我编辑了你的标题。请参阅:“[应该在其标题中包含”标签“](http://meta.stackexchange.com/questions/19190/)”,其中的共识是“不,他们不应该”。 – 2014-12-04 04:12:21

回答

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';它只是序列化字段。 – 2014-12-04 04:24:41

+1

迈克尔是正确的。我在这里有脑屁。 – 2014-12-04 04:34:01

相关问题