개인 구성원 데이터 직렬화 중
개체를 XML에 직렬화하려고 하는데, 이 속성 중 일부는 읽기 전용 속성입니다.
public Guid Id { get; private set; }
[Serializable] 클래스를 표시하고 ISerializable 인터페이스를 구현했습니다.
아래는 제가 객체를 직렬화하기 위해 사용하고 있는 코드입니다.
public void SaveMyObject(MyObject obj)
{
XmlSerializer serializer = new XmlSerializer(typeof(MyObject));
TextWriter tw = new StreamWriter(_location);
serializer.Serialize(tw, obj);
tw.Close();
}
안타깝게도 이 메시지와 함께 첫 줄에 넘어집니다.
잘못된 작업예외를 처리하지 못했습니다.임시 클래스( result=1)를 생성할 수 없습니다.오류 CS0200: 속성 또는 인덱서 'MyObject'입니다.ID'를 다음에 할당할 수 없습니다. 읽기 전용입니다.
Id 속성을 public으로 설정하면 잘 됩니다.제가 뭔가를 하고 있는지, 아니면 적어도 가능한지 누가 말해줄 수 있나요?
당신은 사용할 수 있습니다.DataContractSerializer
(그러나 xml 속성은 사용할 수 없고 xml 요소만 사용할 수 있습니다.):
using System;
using System.Runtime.Serialization;
using System.Xml;
[DataContract]
class MyObject {
public MyObject(Guid id) { this.id = id; }
[DataMember(Name="Id")]
private Guid id;
public Guid Id { get {return id;}}
}
static class Program {
static void Main() {
var ser = new DataContractSerializer(typeof(MyObject));
var obj = new MyObject(Guid.NewGuid());
using(XmlWriter xw = XmlWriter.Create(Console.Out)) {
ser.WriteObject(xw, obj);
}
}
}
또는 다음과 같이 구현할 수 있습니다.IXmlSerializable
모든 걸 직접 해보는 거죠. 하지만 이건 잘 통합니다.XmlSerializer
,적어도.
당신은 사용할 수 있습니다.System.Runtime.Serialization.NetDataContractSerializer
. 이것은 더 강력하고 고전적인 Xml Serializer의 몇 가지 문제를 해결합니다.
이 속성에는 서로 다른 속성이 있습니다.
[DataContract]
public class X
{
[DataMember]
public Guid Id { get; private set; }
}
NetDataContractSerializer serializer = new NetDataContractSerializer();
TextWriter tw = new StreamWriter(_location);
serializer.Serialize(tw, obj);
편집:
Marc의 의견에 근거한 업데이트:당신은 아마 다음을 사용해야 할 것입니다.System.Runtime.Serialization.DataContractSerializer
당신의 경우에는 깨끗한 XML을 얻을 수 있습니다. 나머지 코드는 동일합니다.
읽기 전용 필드는 를 사용하여 직렬화되지 않습니다.XmlSerializer
, 이것은 그 성질 때문입니다.readonly
키워드
MSDN에서:
read only 키워드는 필드에서 사용할 수 있는 수식어입니다.필드 선언에 읽기 전용 수정자가 포함된 경우, 선언에 의해 도입된 필드에 대한 할당은 선언의 일부로 또는 동일한 클래스의 생성자에서만 발생할 수 있습니다.
그래서... 기본 생성자에서 필드 값을 설정해야 합니다...
해당 시리얼라이제이션 모드에서는 불가능합니다(다른 설명 참조).직렬화 모드를 그대로 두려면 이에 대한 프레임워크 제한을 해결해야 합니다.이 예제 참조
기본적으로 속성을 표시합니다.public
, 하지만 역직렬화 이외에 언제든지 접근할 수 있다면 예외를 둘 수 있습니다.
언급URL : https://stackoverflow.com/questions/802711/serializing-private-member-data
'programing' 카테고리의 다른 글
팬더 데이터 프레임 열의 몇 개 값을 다른 값으로 바꿉니다. (0) | 2023.10.11 |
---|---|
문자열 종료를 무효 (0) | 2023.10.11 |
레코드 또는 업데이트가 이미 있는 경우 삽입하는 방법은 무엇입니까? (0) | 2023.10.06 |
프로그래밍 방식으로 Excel 2007 시트 만들기 (0) | 2023.10.06 |
Ricoh Theta S - 자바스크립트로 라이브 프리뷰 (0) | 2023.10.06 |