programing

개인 구성원 데이터 직렬화 중

oldcodes 2023. 10. 6. 21:59
반응형

개인 구성원 데이터 직렬화 중

개체를 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

반응형