문제

최근 질문에 이어 웹 서비스 결과로서의 크고 복잡한 개체.나는 미래의 모든 자식 클래스가 XML로 직렬화되도록 보장할 수 있는 방법에 대해 생각해 왔습니다.

이제 분명히 다음을 구현할 수 있습니다. IXml직렬화 가능 그런 다음 리더/라이터를 인터페이스에 집어넣지만 그렇게 하지 않으려면 원할 때마다 리더/라이터를 인스턴스화해야 하고 99.99%의 시간 동안 작업하게 될 것이기 때문입니다. 그래서 나는 그냥 내 것을 쓸 수도 있습니다.

그러나 XML로 직렬화하려면 클래스와 해당 멤버를 다음과 같이 장식하면 됩니다. XML??? 속성( Xml루트 , Xml요소 등) 그런 다음 이를 XmlSerializer 그리고 스트링라이터 문자열을 얻으려면.모두 좋습니다.문자열을 반환하는 메서드를 일반 유틸리티 메서드에 넣어 유형 등에 대해 걱정할 필요가 없도록 하려고 합니다.

제가 우려하는 점은 다음과 같습니다.필수 속성으로 클래스를 장식하지 않으면 런타임까지 오류가 발생하지 않습니다.

속성 장식을 적용하는 방법이 있나요?FxCop으로 이 작업을 수행할 수 있습니까? (아직 FxCop을 사용해본 적이 없습니다)

업데이트:

마감이 늦어져서 죄송합니다. 할 일이 많습니다!

FxCop(모든 것을 함께 유지하는 것과 같은)에 의존하는 대신 테스트 케이스에서 리플렉션을 사용하는 아이디어가 확실히 마음에 듭니다. Fredrik Kalseth의 답변 환상적이었습니다. 코드를 포함해 주셔서 감사합니다. 직접 수행하는 방법을 알아내려면 약간의 시간이 걸렸을 것입니다!

비슷한 제안을 위해 다른 사람들에게 +1 :)

도움이 되었습니까?

해결책

나는 주어진 기준과 일치하는 모든 클래스(예: 하위 클래스 X)가 적절하게 장식되었는지 확인하는 단위/통합 테스트를 작성하겠습니다.테스트를 통해 실행되도록 빌드를 설정한 경우 이 테스트가 실패하면 빌드가 실패할 수 있습니다.

업데이트:"팔을 걷어붙이고 단위 테스트가 전체적으로 유지되는지 확인하면 될 것 같습니다."라고 말씀하셨는데, 그럴 필요는 없습니다.어설션이 필요한 모든 클래스를 찾기 위해 리플렉션을 사용하는 일반 테스트 클래스를 작성하면 됩니다.이 같은:

[TestClass]
public class When_type_inherits_MyObject
{
    private readonly List<Type> _types = new List<Type>();

    public When_type_inherits_MyObject()
    {
        // lets find all types that inherit from MyObject, directly or indirectly
        foreach(Type type in typeof(MyObject).Assembly.GetTypes())
        {
            if(type.IsClass && typeof(MyObject).IsAssignableFrom(type))
            {
                _types.Add(type);
            }
        }
    }

    [TestMethod]
    public void Properties_have_XmlElement_attribute
    {
        foreach(Type type in _types)
        {
            foreach(PropertyInfo property in type.GetProperties())
            {
                object[] attribs = property.GetCustomAttributes(typeof(XmlElementAttribute), false);
                Assert.IsTrue(attribs.Count > 0, "Missing XmlElementAttribute on property " + property.Name + " in type " + type.FullName);
            }
        }
    }
}

다른 팁

이런 종류의 사항을 확인하기 위해 단위 테스트를 작성할 수 있습니다. 기본적으로 리플렉션을 사용합니다.

이것이 가능하다는 사실을 감안할 때 FxCop 규칙을 작성하는 것도 가능할 것이라고 생각하지만 저는 그런 일을 해본 적이 없습니다.

FxCop 규칙을 작성하거나 기본 클래스의 생성자에서 GetType()을 호출하고 반환된 유형을 반영하여 특성을 확인할 수도 있습니다.

좋은 FXCop 규칙(그리고 지금 당장 필요한 규칙)은 ASP.NET 세션에 추가되는 모든 개체에 직렬화 가능 특성이 있는지 확인하는 것입니다.InProc 세션 상태에서 SQL Server로 이동하려고 합니다.처음 페이지를 요청했을 때 직렬화할 수 없는 개체가 세션에 저장되어 있었기 때문에 사이트가 폭발했습니다.그런 다음 세션에 개체가 설정된 모든 인스턴스를 찾기 위해 모든 소스 코드를 검색하는 작업이 수행되었습니다.FXCop은 좋은 솔루션이 될 것입니다.작업할 부분이...

또한 이 개념/후처리기를 사용하여 속성 간의 관계를 적용하고 비슷한 로그인을 사용하여 컴파일 타임에 클래스와 속성 간의 관계를 적용할 수 있습니다.

http://www.st.informatik.tu-darmstadt.de/database/publications/data/cepa-mezini-gpce04.pdf?id=92

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top