2013-05-24 4 views
3

DataContractSerializer의 단일 인스턴스를 동시에 캐시하여 동일한 루트 유형에 대해 여러 번 serializer를 인스턴스화하는 페널티를 피하기 위해 여러 스레드에서 동시에 사용하려고합니다. 각 스레드는 다른 객체를 직렬화 할 것이지만 DataContractSerializer 객체 자체가 공유됩니다. (IDataContractSurrogate 또는 DataContractResolver을 사용하지 않을 것입니다. 이는 더 복잡한/공식 XML/XSD 스키마와 관련이있는 것 같습니다.)System.Runtime.Serialization.DataContractSerializer 스레드가 안전합니까?

괜찮습니까?

In MSDN under "Thread Safety" for System.Runtime.Serialization.DataContractSerializer, 그것은 말한다 :이 클래스의

인스턴스는 스레드 인스턴스가 IDataContractSurrogate 또는 DataContractResolver의 구현에 사용 인 경우를 제외하고 안전합니다.

이 항목은 다소 모호합니다 (MSDN 스레드 안전 지침의 일반적인 내용). 그러나 사용 사례가 적절하다는 것을 나타내는 것 같습니다. 보너스 당신이 개인적인 경험, 단위 테스트, 또는 그것을 설명하는 프레임 워크 해체를 가리킬 수 있다면 보너스 :

추신. 그 사람의 이슈가 DataContractSerializer 자체의 스레드 안전과 관련이없는 것으로 판명 되었기 때문에 이것이 Is WCF's DataContractSerilaizer thread safe?의 중복이라고 생각하지 않습니다.

+0

단위 테스트 또는 개인 경험을 사용하여 스레드로부터 안전하다는 것을 증명할 수는 없습니다. 당신은 ** 무언가 ** 스레드 안전하지 않다는 것을 증명하기 위해 사용할 수 있습니다. 그러나 반드시 필요하지는 않습니다. –

+0

말하기 어렵습니다. 스레드에서 메가 바이트를 구울 때 킬로바이트 복사본을 저장할 필요가 없습니다. –

+0

@MarcGravell 나는 이론 *에서 하나의 단위 테스트로 스레드 안전성을 증명할 수 없다고 생각한다. 궁극적으로 튜링 중단/완전성 문제 때문이다. 하지만 제 경험상 대부분의 스레드 안전 문제는 몇 분 동안 정말 강렬한 멀티 스레딩을 수행하고 어떤 종류의 손상을 찾을지를 알 수있는 단위 테스트로 재현 될 수 있습니다. 누군가가 이미 테스트를 작성하거나 프레임 워크 디스 어셈블리를 읽는 데 어려움을 겪고 있기를 바랄뿐입니다. –

답변

1

예 사용 사례가 적절합니다. DataContractResolverIDataContractSurrogate에 대한 구현은 DataContractSerializer 사용자가 수행합니다. 구현 및 구성하지 않은 경우 스레딩 문제가 없습니다. 그렇지 않으면 MSDN 설명서가 잘못 될 수 있습니다.

MSDN은 DataContractResolver 및 IDataContractSurrogate의 사용을 배제한 것으로 간주합니다. 잘못된 방법 (즉, 스레드로부터 안전하지 않음)으로 처리 할 수 ​​있기 때문입니다. 그러나 유감스럽게도 그것을 문서화 한 증거는 없습니다.

+0

감사합니다. 우리 모두가 동일한 의미를 해석 할 수 있도록 여러 눈으로 문서를 읽는 것이 좋습니다. –

관련 문제