2010-03-05 3 views
16

Event 클래스 멤버를 직렬화하지 않도록해야합니다. 이벤트가 Serializable로 표시되지 않은 객체에 의해 처리 될 때 직렬화가 실패하기 때문입니다.바이너리 직렬화를위한 이벤트 클래스 멤버를 무시하는 방법?

Event 클래스 멤버에서 NonSerialized 특성을 사용해 보았지만 컴파일에 실패했습니다. 이 코드 행 : 이벤트 멤버를 직렬화 방지하는 또 다른 방법은

Attribute 'NonSerializedAttribute' cannot be applied to 'PropertyValueChanged' because the attribute is not valid on this declaration type.

Public Event PropertyValueChanged() ' compiles but needs the extra handling described below 

있습니까 :

<NonSerialized()> Public Event PropertyValueChanged() 

는 다음과 같은 오류가 발생합니다?

이벤트가 처리되지 않는 경우 문제가되지 않으므로 일련 화하기 전에 개체를 복제하고 이벤트를 무시하여 문제를 해결할 수 있습니다. 더 좋은 방법이 있는지 궁금합니다.

감사합니다.

+0

@Paul - "여전히 실패 함"; 당신이하고 싶은 것이 정확히 무엇입니까? serializer를 변경하는 것이 좋은 옵션이 될지 궁금해합니다. (소리가 나지 않고 부작용도 있습니다.) 물론 당신까지,하지만이 영역에 대해 * 시간 동안 이야기 할 수 있습니다. ... –

+0

@Marc : 다음 사항을 알려 주셔서 감사합니다. 직렬화가 불가능한 객체에 이벤트가 연결될 때 직렬화가 실패하므로 클래스를 직렬화 할 때 이벤트를 무시하면됩니다. NonSerialized 속성은 의미가 있지만 VB에서 C#과 같은 방식으로 작동하지 않는 것 같습니다 ... 공용 필드 속성에 대한 배킹 필드를 장식 할 때도 컴파일러 오류가 발생합니다. "serializer 변경"이란 무엇을 의미합니까? 사용자 지정 직렬화 또는 다른 타사 라이브러리를 의미합니까? –

답변

32

C#에서는 다음과 같이 할 수 있습니다. 따라서 으로 VB와 동일하게 변환됩니다.

참고이 전용 필드와 같은 이벤트를 적용 (당신이없는 즉, 어디에 자신의 add/remove) :

[field: NonSerialized] 
public event EventType EventName; 

그렇지 않으면 뭔가 같은 :

[NonSerialized] 
EventType backingField; 
public event EventType { 
    add { backingField += value; } 
    remove { backingField -= value; } 
} 
+0

+1 나는이 질문에 답할 때 당신을 때릴 길은 없을 것이라고 알고 있었음에 틀림 없다. – kemiller2002

+0

음 뭔가 새로운 것을 배웠습니다 :) 좋은 해결책. – NebuSoft

+0

불행히도 어느 옵션도 VB로 변환되지 않습니다 ... –

5

그것은 아니다 컴파일러가 실제로 이벤트의 백킹 필드를 생성하기 때문에 작동합니다. 그것을 사용하려면, 단지 필드와 속성을 접두사 : 나는이 프로젝트를 위해 과거에 한 적이 어떻게

[field: NonSerialized] 
public event EventHandler PropertyValueChanged; 
+0

이것은 어떤 이유로 VB.NET에서 작동하지 않습니다. –

0

는 IXmlSerializable 인터페이스를 구현하고 수동으로 직렬화를 제어 할 수 있습니다. 이게 GUI 기반 컨트롤 (많은 이벤트가있는)을 훨씬 더 쉽게 직렬화하는 것을 알 수 있습니다.

IXmlSerializable

+0

'IXmlSerializable'은 바이너리 직렬화에 적용되지 않습니다.그것은 매우 다른 'ISerializable'이 될 것입니다. –

+0

그가 Binary로 태그를 지정한 곳을 놓쳤습니다. 내 실수, 어떤 이유로 나는 그가 XML을 요구하고 있다고 생각했다. – NebuSoft

관련 문제