2013-02-10 6 views
6

최근에 특정 논리를 처리하고 특정 수명주기가있는 직렬화 가능 객체를 작성했습니다. 이 함수가 제대로 작동하려면 적절한 생성자로 인스턴스화해야하며 필수 인수가 필요합니다. 그러나 직렬화를 위해 공용 기본 생성자를 추가해야합니다.[Obsolete] 속성을 사용하여 개발자에게 API의 일부를 사용하지 않도록 지시하는 것이 바람직합니까?

객체는 Google API에서 공개적으로 사용할 수 있으며 타사 개발자는이를 인스턴스화하고 사용할 수 있어야합니다. 이 객체를 올바르게 조작하는 방법에 대한 적절한 문서가있을지라도, 누군가가 잘못된 생성자를 사용하고 유혹을 느끼지 않을 수도 있습니다.

타사 개발자가 코드를 작성하는 동안 약간의 지침을 적용 할 수있는 좋은 방법을 모색 중입니다. Obsolete 속성이 나왔습니다. 직렬화 생성자에 적절한 주석을 메시지로 주석을 추가 할 수있었습니다. 그러면 메시지가 출력 경고에 나타나고 개발자가 올바른 코드 행으로 이동합니다. 또한 생성자 사용은 Visual Studio 및 사용 된 모든 코드 검사 추가 기능에서 적절히 강조 표시됩니다.

이 접근법에서 나를 귀찮게하는 것은 Obsolete 속성의 목적이 아주 다른 것입니다. 의미있는 것은 데코 레이팅 된 항목이 더 이상 사용되지 않으며 이후 버전에서 제거 될 것임을 의미합니다. 직렬화 생성자 시나리오에서 이것은 잘못되었으며이 속성의 사용법과 의미간에 불일치가있을 것입니다. 일부 개발 부서에서 사용할 수있는 "경고를 오류로 처리"하는 옵션은 말할 것도 없습니다 ...

그래서이 속성의 사용에는 허용되는 관행입니까? 동일한 효과를 얻으려는 다른 법적 및 보편적 인 방법이 있습니까 (보편적으로 제 3 자 코드 검사 애드온 등에 의존하지 않음 - 코드를 사용하는 사람과 해당 설정을 제어하지 않음)? (아직도 나에게 유용하다) 아래의 대답에 코멘트에 관해서


, 나는 내가 상속 클래스에 보호 기본 생성자를 사용하고 있음을 명확히해야합니다. 생성자는 XML 직렬화를 지원하지만 비즈니스 논리에서 클래스를 초기화하는 데 사용해서는 안됩니다. 상속 클래스는 다른 기본 생성자 중 일부를 호출해야하며 상속 된 클래스를 작성하는 개발자는이를 알아야합니다. 여전히이 코드에서 파생 된 개발자는 필요할 경우 상속 된 클래스에 대해 XML 직렬화를 사용 가능하게하는 방법을 가져야합니다.

+4

[EditorBrowsable (EditorBrowsableState.Never)]을 사용하면 개발자가 intellisense에서 생성자를 숨겨 개발자가 제안을 받아 문서를 확인하지 않고 실수로 사용하지 못하게 할 수 있습니다. – fsimonazzi

+0

@fsimonazzi, 유용한 정보를 제공해 주셔서 감사합니다. 같은 방식으로 아무도 사용자 코드에 의해 사용되지 않는 멤버가 액세스되는 것을 막을 수 없으므로 귀하의 제안은 매우 유효하고 더 많은 장소에서 이루어집니다. –

답변

3

흠, 나는 이것이 좋은 해결책이라고 생각하지 않습니다. 그러나, 당신은 정말로 기본 생성자가 필요합니까?

직렬화 API에는 생성자를 전혀 사용하지 않고 초기화되지 않은 인스턴스를 만드는 방법이 있습니다 (MSDN : FormatterServices.GetUninitializedObject 참조).

또한 일반 사용자 지정 serialization 생성자는 기본 생성자가 아니라 SerializationInfo 및 StreamingContext를 사용하는 기본 생성자입니다. 사용자 지정 serialization이있는 경우 기본 생성자를 internal로 설정하고 serialization을 수행하는 어셈블리에 InternalsVisibleToAttribute을 적용하여 문제를 해결할 수도 있습니다.

+1

deserialization 문제를 명확히하기 위해 이진 (기본값)이 아니라 .NET Framework의 일부인 XML serialization에 대해 설명했습니다. 그것은 매개 변수없는 생성자가 필요합니다. 생성자는'public' 일 필요는 없지만 클래스가 상속되어야하고 직렬화 기능을 유지해야한다면, 생성자는 적어도'protected'이어야합니다 (물론, 다른 생성자 중 일부가 당신을 위해 작동한다면, 하지만 그것은 문제의 경우가 아닙니다.) –