In to the C# 2014. 1. 17. 14:32

Delegates와 Serialization

C#에서 클래스를 직렬화 하는 것은 매우 쉽습니다.

클래스 선언 전에 [Serializable] attribute만 추가 해주면 아주 멋지고 쉽게 직렬화가 가능합니다.


그런데 아래와 같은 delegates(이하 대리자)가 멤버로 있을 때 문제가 될 수 있습니다.



예제는 Action이 있는데요. C#의 대표적인 대리자가 있습니다. 대리자도 하나의 객체 이기 때문에 위와 같이 클래스를 선언하고 인스턴스를 직렬화 하게 되면 대리자도 같이 직렬화가 됩니다.


여기서 중요한건 역직렬화 할 때 잘 될 수도 있고, Exception 에러가 날 수도 있습니다. 대리자를 직렬화 하는건 매우 어려우며, 하더라도 내부의 타겟 객체의 모든 것을 제대로 직렬화 하는걸 보장 하지 않기 때문입니다.

결론적으로 대리자는 직렬화 대상에서 빼야 하며 설계 시 아래와 같이 해주어야 합니다. 개발자가 어떻게 직렬화 할 수 있는 문제가 아닙니다!!



Protobuf-net에서는 Protomember로 선언을 하여도 직렬화 대상이 되질 않으며, 역직렬화 시 null 값이 채워집니다.

'In to the C#' 카테고리의 다른 글

Lazy Initialization  (0) 2014.01.20
BookSleeve - Pipelined .NET bindings for redis  (0) 2014.01.17
Dispose in C#  (0) 2014.01.14
Thread Pool과 Task  (0) 2014.01.14
Google Protocol Buffer 사용해보기 with C# - 세번째  (0) 2014.01.14