즉, 데이터를 한 방향으로 이동하여 클래스에 넣고 싶지만 직렬화 작업 중에 데이터를 저장하지 못하게해야합니다. 그것에 대해 가장 좋은 방법은 무엇입니까?XmlSerializer : 속성을 deserialize 할 수 있지만 serialize를 중지 할 수 있습니까?
답변
좋아, 내가 시도 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
라고 누가 볼 수있는 스택 트레이스를 검사 - 그리고는 시리얼 라이저/작가 인 경우에, 아무 것도 반환하지 않습니다.
직렬화 프로세스에 대한 완전한 제어가 마음에 들면 인터페이스 ISerializable을 구현할 수 있습니다.
또한 특수 생성자를 구현하십시오.
편집 : 나는 IXmlSerializable을 의미했습니다. 존 감사합니다.
가장 간단한 방법은 Set
을 올바르게 수행하지만 항상 Get
에 고정 된 가짜 값을 반환하는 속성을 직렬화하는 것입니다. 예를 들어 속성이 Password
이라면 위의 디자인에 맞는 SerializablePassword
속성을 만들고 원본은 serialize하지 않아야합니다.
편집 다음
한 변화 포맷 애니의 샘플,이다 :
이[XmlIgnore]
public string Password { get; set; }
[XmlElement("Password")]
public string SerializablePassword
{
get { return null; }
set { Password = value; }
}
음, 그래, 나는 그것을 고려했다. 그러나, 만약 내가 get {return null; }, 내부적으로 값에 액세스 할 수 없었습니다. –
@ end-user :'SerializablePassword'를 설정하면'Password'와 같은 뒷받침 필드가 설정되어'Password'를 얻는 것이 정상적으로 작동합니다. –
+1 @ Steven : 내가 올바르게 이해한다면 이것과 비슷한 것입니까? 좋은 생각, 해킹 조금 .. :) [XmlIgnore] public string Password {get; } public string SerializablePassword { get {return null;} set {암호 = 값; } } – Ani
일반적인 XY 질문입니다. 왜 X인가? –
@ 한스 : 내 추측은 보안이다. –
참고로 XML Serializer는 C#과 관련이 없습니다. 그것은 .NET의 일부입니다. –