문제

내가 작업하고있는 프로젝트는 다시 시작할 때이 직렬화 된 데이터에서 상태를 종료하기 전에 데이터 구조를 직렬화해야합니다.

작년에 우리는 .NET 1.1을 구축했으며 까다로운 문제를 해결했습니다.

  • 우리의 코드는 .NET 2.0에서 실행되었습니다
  • 고객은 어떻게 든 1.1을 기본값으로 설정 한 일부 소프트웨어로 업그레이드했습니다.
  • 우리의 코드는 .NET 1.1에서 실행되었으며 저장된 상태를 사로화 할 수 없었습니다.

이 특정 문제는 특정 소프트웨어 업그레이드를 금지하여 "해결"되었으며, 우리는 .NET 2.0 프레임 워크를 목표로 삼아 문제가되지 않아야합니다 (따라서 1.1에서 실행할 수는 없습니다).

이 직렬화가 2.0과 새로운 프레임 워크 사이에서 호환되지 않게 다시 변할 수있는 기회는 무엇입니까? 우리가 사용하는 경우 <supportedVersion> 코드를 2.0.50727로 고정하려면 2.0.50727.1434와 2.0.50727.nnn (일부 향후 릴리스)의 변경 가능성은 얼마입니까? 직렬화되는 데이터 구조는 표준 클래스 라이브러리의 배열, 맵, 문자열 등입니다.

또한, 2.0.50727 프레임 워크가 추가 .NET 업그레이드 후에도 항상 설치 될 것인가? Microsoft 문서에 대한 포인터를 환영합니다.

도움이 되었습니까?

해결책

프레임 워크 버전 사이에 변화가있을 가능성이 낮습니다 (0 명!). 의도는 이진 직렬화 및 원격을 사용하여 클라이언트와 다른 프레임 워크 버전을 실행하는 서버간에 통신 할 수 있어야합니다. .NET 1.X와 2.0 사이의 비 호환성 버그입니다 패치를 사용할 수 있습니다.

그러나 이진 직렬화에는 다른 문제, 특히 직렬화 된 구조의 버전 관리에 대한 지원이 좋지 않습니다. 설명한 유스 케이스에서 XML 직렬화는 명백한 선택입니다. DataContractSerializer는 .NET 3.X에 대한 의존성을 신경 쓰지 않으면 XMLSerializer보다 유연합니다.

.NET Framework 2.0이 항상 향후 Windows 버전에 설치 될 것이라고 보장 할 수는 없습니다. 그러나 Microsoft는 대부분의 .NET 2.0 앱이 .NET 4.X 및 이후 버전에서 변경되지 않은 상태로 실행되도록 열심히 노력할 것이라고 확신합니다. 나는 이것에 대한 언급이 없습니다. 그러한 약속은 어떤 경우에도 다음 버전의 Windows (Windows 7)에만 적용됩니다.

다른 팁

경험의 규칙은 일반적으로 다음과 같습니다. XML 직렬화는 새로운 프레임 워크 버전에서 살아남을 수 있어야하므로 장기적으로 저장 될 수 있지만 이진 직렬화는 할 수 없으므로 일시적이어야합니다).

어떤 시리얼 라이저를 사용하고 있습니까? 여러면에서 XmlSerializer 또는 DatacontractSerializer와 같은 직렬 라이저는 여러 세부 사항에서 완충하고 더 간단한 확장 옵션을 제공합니다. 어느 시점에서, 새로운 CLR 버전은 의심 할 여지없이 필요할 것입니다. 따라서 아무도 약 2.0.50727에 대해 보장 할 수 없다고 생각합니다. 하지만 단기적으로 안전해야합니다. 그리고 나는 더 적은 변화 변화를 희망 할 것입니다 ...

다른 답변에 대한 다음 메모 업데이트

공간/성능 이유에 대한 이진 형식을 원한다면 다른 옵션은 다른 바이너리 시리얼 라이저를 사용하는 것입니다. 예를 들어, protobuf-net 모든 .NET 변형*에서 작동하지만 바이너리 형식 (Google에서 DVISID)은 크로스 플랫폼 호환 (Java, C ++ 등)이므로 매우 휴대적이고 빠르며 작습니다.

*= 마이크로 프레임 워크에서 시도하지는 않았지만 CF, Silverlight, Mono, .NET 2.0 등이 모두 지원됩니다.

호환성이 우려되는 경우 iserializable 인터페이스는 당신이 찾고있는 치료법 일 수 있습니다. 이 인터페이스는 항목을 직렬화하는 방법을보다 잘 제어 할 수 있습니다. 자세한 정보는 이것을 시도하십시오 MSDN에 관한 기사.

다른 답변에 추가 할 두 가지가 있습니다 ...

첫째, 관습을 사용합니다 직렬화 바인더 레거시 직렬화 된 데이터를 가져 오는 데 많은 어려움을 겪을 수 있습니다.

둘째, 나는 광범위한 글을 쓰는 것이 필수라고 생각합니다 단위 테스트 지속되는 데이터의 경우. 나는 항상 두 가지 테스트를합니다.

  1. 왕복 테스트 - 객체를 직렬화하고 실질화하고 정확히 같은 것을 다시 얻을 수 있습니까?
  2. 레거시 가져 오기 테스트 - 모든 릴리스 버전의 앱 버전에서 직렬화 된 데이터 버전이 있는지 확인하십시오. 데이터를 가져와 모든 것이 예상대로 다시 오는지 확인하십시오.

유연성과 버전화를 높이려면 XML을 사용할 필요가 없습니다.

Simon Hewitt의 오픈 소스 라이브러리를 사용했습니다. .NET -Part 2에서 직렬화 최적화 기본 .NET 직렬화 대신. 일부 자동화를 제공하지만 본질적으로 직렬화되고 사형화 된 정보 스트림을 제어 할 수 있습니다. (파일) 버전을 먼저 직렬화 할 수 있고 정보 스트림이 해석되는 방식은 버전에 따라 다릅니다.

명시 적 직렬화 / 사막화로 인해 다소 지루하지만 매우 간단합니다.

보너스로서 20-40 배 더 빠르며 큰 데이터 세트의 공간을 덜 차지하지만 (경우에는 중요하지 않을 수 있음) 보너스.

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