2009-03-26 3 views
4

Does the order of fields in C# matter?에서 설명한대로 직렬화 가능 속성의 순서는 XmlSerializer 출력에 영향을줍니다.C# 부분 클래스의 XML 직렬화 순서를 제어하는 ​​것은 무엇입니까?

그러나 필드가 부분 클래스를 사용하는 2 개의 파일에 있으면 실제로 결과 순서를 제어하는 ​​것이 무엇인지 알 수 있습니까? 즉, 어떤 파일의 속성이 먼저 나옵니까?

(배경 : 2 파일 중 하나가 xsd에서 자동으로 생성되고 다른 파일이 수동으로 편집되는 시나리오를 실행했기 때문에이 질문을합니다. 테스트 결과는 개발자 상자와 스크립트에 따라 다릅니다. 아마도 두 가지 환경에서 xsd-> C# 단계의 타이밍과 히스토리의 몇 가지 차이점의 부작용이 될 수 있습니다. 수정하는 방법은 다양하지만 가능하면 컴파일 과정을 좀 더 잘 이해하고 싶습니다. .)

답변

2

C# spec마다 아무 것도 보장되지 않습니다.

+0

감사합니다. Mehrdad. 나는 내 자신의 관찰을 바탕으로 당신의 대답을 약간 연장 할 것이다. 1. 귀하가 말한대로 주문이 보장되는 것은 아닙니다. 2. VS 2008에서는 순서가 파일 이름 정렬 순서의 기능 중 일부 이상을 차지합니다. 즉, 파일의 이름을 바꾸면 순서에 영향을 줄 수 있습니다. -Eric –

2

나는 [Serializable]이라고 표시하여 객체를 만드는 '쉬운'접근법을 사용하는 것이 일반적으로 매우 간단한 구현에만 충분하다는 것을 알았다.

매우 쉽게 할 수있는 IXmlSerializable 인터페이스를 구현하고 필요한 모든 컨트롤을 제공하는 것이 좋습니다. 우리의 직렬화 순서는 직렬화 관련된 클래스 중 하나를 수정하지 않고 출시 된 후 변경

우리는 정확히 같은 문제가 있었다 : 여기

+0

우리는 우리가 더 많이 또는 더 적게 찾을 수있는 곳에서 그렇게합니다. 이 경우 코드 관리가 쉽기 때문에 절대적인 통제가 필요하지 않습니다. 가능한 경우 우리의 패턴은 .xsd를 소스로 처리하고 xsd.exe를 통해 C#을 빌드 전 단계로 자동 생성하고 필요에 따라 부분 클래스를 확장하는 것입니다. 이 경우 궁극적으로 선택한 "수정" 우리의 확장을 포함하는 파일의 이름을 partial 클래스로 바꾸는 것이 었습니다. –

1

우리가 불쾌한 버그의 수정을 통해 알아 낸 것입니다.

우리는 xsd-s에서 생성 된 클래스의 절반을 가지고 있었고 나머지 절반은 손으로 만들었습니다. 주문 속성은 효과가 없었습니다. 우리가 본 것은 릴리스 이전에 손으로 만든 부분 부분이 먼저 직렬화 된 다음 순서가 변경된 것입니다.

해결책은 두 개의 클래스가 들어있는 프로젝트 파일의 파일 순서가 입니다. MSBuild (빌드 서버에서)를 빌드 한 후 serializer는 직렬화 된 XML의 첫 번째 ("csproj") ".cs"파일의 요소를 먼저 배치합니다. csproj에서 ".cs"파일의 순서를 변경하면 순서가 바뀌었고 생성 된 부분은 XML에서 필요에 따라 앞에있었습니다.

파일의 이름을 변경하면 csproj의 항목이 순서대로 정렬되므로 위의 Eric Hirst의 답변과 관찰 내용과 일치합니다 (일반적으로 알파벳 순서 임). 이런 이유로 csproj를 손으로 편집하는 것에 조심하십시오.

관련 문제