2011-04-10 4 views
1

파일에서로드되는 여러 리소스가 포함 된 클래스가 있습니다. 이 클래스의 객체를 XML로 직렬화하려고하지만 실제 자원 자체가 아닌 자원에 대한 경로가 필요합니다.XMLSerializer 용 특별 게터 및 설정자

지금까지 리소스에 대한 경로를 저장하고 리소스 자체에 XMLIgnore을 사용하는 ResourceSource 개의 필드를 만들어이 문제를 해결했습니다. 그러나, 이것들은 공개적이지 않아서 좋지 않습니다.

정말 원하는 것은 XMLSerialize에 의해서만 실행되는 특별한 속성 접근자를 만들 수 있다는 것입니다. 이 기능이 존재합니까? 아니면 구현할 수있는 방법이 있습니까?

또는 ResourceSource 필드를 XMLSerialize를 통해서만 액세스 할 수 있도록 설정할 수 있습니까?

답변

1

대신 IXmlSerializable을 구현 했습니까? 이렇게하면 직렬화 프로세스를보다 세밀하게 제어 할 수 있습니다.

이 인터페이스를 구현하는 데는 두 가지 이유가 있습니다. 첫 번째 방법은 개체의 serialize 또는 deserialize를 XmlSerializer에서 제어하는 ​​것입니다. 예를 들어, 대용량 데이터 세트를 버퍼링하는 대신 데이터를 바이트로 청크 처리하고, Base64 인코딩을 사용하여 데이터를 인코딩 할 때 발생하는 인플레이션을 피할 수 있습니다. 직렬화를 제어하려면 XML 읽기 및 쓰기에 사용되는 XmlReader 및 XmlWriter 클래스를 제어하는 ​​ReadXml 및 WriteXml 메서드를 구현합니다.

두 번째 이유는 스키마를 제어 할 수 있기 때문입니다. 이 기능을 사용하려면 serializable 형식에 XmlSchemaProviderAttribute를 적용하고 스키마를 반환하는 정적 멤버의 이름을 지정해야합니다.

+0

내가 원했던 것처럼 보입니다. 내 리소스 클래스에서 이것을 구현하면 내가 원하는 것을 할 수있다. –

0

클래스가 여러 가지 책임을지기 위해 오버로드되고있는 것처럼 들리는데, 이는 거의 항상 리팩토링을위한 적기입니다.

내가 할 수있는 것은 리소스 경로를 저장하는 하나의 직렬화 가능 클래스와 리소스 자체를 저장하는 클래스를 갖는 것입니다. 직렬화 가능하지 않은 클래스의 생성자는 직렬화 된 클래스의 인스턴스를 가져 와서 디스크에서 리소스를로드 할 수 있습니다.

+0

당신은 중요한 것을 만들지 만, 내 수업에는 여러 가지 책임이 있다고 생각하지 않는다. 방금 클래스에 저장 및로드 메서드가 있어야하며 데이터 자체가 아닌 다른 파일에 대한 참조를 포함하기 위해로드/저장하는 파일이 필요합니다. –