2014-12-04 10 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가 내 perf 테스트에서 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'를 무시한다는 것입니다; 필드를 serialize 만합니다. –

+1

마이클이 맞습니다. 여기에 두뇌 방구가 있었어. –