2010-08-09 3 views
1

즉, 데이터를 한 방향으로 이동하여 클래스에 넣고 싶지만 직렬화 작업 중에 데이터를 저장하지 못하게해야합니다. 그것에 대해 가장 좋은 방법은 무엇입니까?XmlSerializer : 속성을 deserialize 할 수 있지만 serialize를 중지 할 수 있습니까?

+0

일반적인 XY 질문입니다. 왜 X인가? –

+0

@ 한스 : 내 추측은 보안이다. –

+0

참고로 XML Serializer는 C#과 관련이 없습니다. 그것은 .NET의 일부입니다. –

답변

0

좋아, 내가 시도 return null; 제안하지만 작동하지 않습니다; 역 직렬화에 실패합니다. 그러나 여기에 해결 방법은 다음과 같습니다

public List<Program> Programs 
{ 
    get 
    { 
     System.Diagnostics.StackTrace stackTrace = new System.Diagnostics.StackTrace(true); 
     for (int i = 0; i < stackTrace.FrameCount; i++) 
     { 
      if ("XmlSerializationWriterApplication".Equals(stackTrace.GetFrame(i).GetMethod().ReflectedType.Name)) 
      { 
       return null; 
      } 
     } 
     return programs; 
    } 
    set { programs = value; } 
} 

동안은 아마 매우 확대됨에하지, 이것은 get라고 누가 볼 수있는 스택 트레이스를 검사 - 그리고는 시리얼 라이저/작가 인 경우에, 아무 것도 반환하지 않습니다.

1

직렬화 프로세스에 대한 완전한 제어가 마음에 들면 인터페이스 ISerializable을 구현할 수 있습니다.

또한 특수 생성자를 구현하십시오.

편집 : 나는 IXmlSerializable을 의미했습니다. 존 감사합니다.

2

가장 간단한 방법은 Set을 올바르게 수행하지만 항상 Get에 고정 된 가짜 값을 반환하는 속성을 직렬화하는 것입니다. 예를 들어 속성이 Password이라면 위의 디자인에 맞는 SerializablePassword 속성을 만들고 원본은 serialize하지 않아야합니다.

편집 다음

한 변화 포맷 애니의 샘플,이다 :

[XmlIgnore] 
public string Password { get; set; } 

[XmlElement("Password")] 
public string SerializablePassword 
{ 
    get { return null; } 
    set { Password = value; } 
} 
+0

음, 그래, 나는 그것을 고려했다. 그러나, 만약 내가 get {return null; }, 내부적으로 값에 액세스 할 수 없었습니다. –

+0

@ end-user :'SerializablePassword'를 설정하면'Password'와 같은 뒷받침 필드가 설정되어'Password'를 얻는 것이 정상적으로 작동합니다. –

+2

+1 @ Steven : 내가 올바르게 이해한다면 이것과 비슷한 것입니까? 좋은 생각, 해킹 조금 .. :) [XmlIgnore] public string Password {get; } public string SerializablePassword { get {return null;} set {암호 = 값; } } – Ani

관련 문제