문제

인터페이스를 명시적으로 구현하는 간단한 유형이 있습니다.

public interface IMessageHeader
{
    string FromAddress { get; set; }
    string ToAddress   { get; set; }
}

[Serializable]
public class MessageHeader:IMessageHeader
{
  private string from;
  private string to;

  [XmlAttribute("From")]
  string IMessageHeade.FromAddress
  {
    get { return this.from;}
    set { this.from = value;}
  }

 [XmlAttribute("To")]
 string IMessageHeade.ToAddress
 {
    get { return this.to;}
    set { this.to = value;}
 }
}

IMessageHeader 유형의 객체를 직렬화 및 역직렬화하는 방법이 있습니까??

시도했을 때 다음 오류가 발생했습니다.

"인터페이스 IMessageHeader를 직렬화할 수 없습니다"

도움이 되었습니까?

해결책

내부적으로 직렬화를 수행하는 Activator.CreateInstance(typeof(IMessageHeader))를 수행할 수 없기 때문에 IMessageHeader를 직렬화할 수 없습니다.구체적인 유형이 필요합니다.

typeof(MessageHeader)를 수행하거나 MessageHeader의 인스턴스를 갖고 다음을 수행할 수 있습니다.

XmlSerializer serializer = new XmlSerializer(instance.GetType())

다른 팁

아니요, 직렬 변환기에는 인스턴스화할 수 있는 구체적인 클래스가 필요하기 때문입니다.

다음 코드가 주어지면:

XmlSerializer ser = new XmlSerializer(typeof(IMessageHeader));

IMessageHeader header = (IMessageHeader)ser.Deserialize(data);

Deserialize()에서 반환하기 위해 직렬 변환기는 어떤 클래스를 생성합니까?

이론적으로는 XmlSerializer를 사용하지 않고 인터페이스를 직렬화/역직렬화하는 것이 가능합니다.

IXmlSerialized를 IMessageHeader 선언에 추가해 보십시오. 하지만 작동하지 않을 것 같습니다.

내가 기억하는 바로는 .net xml 직렬 변환기는 기본 생성자가 있는 구체적인 클래스에서만 작동합니다.

문제는 인터페이스를 역직렬화할 수 없지만 구체적인 클래스를 인스턴스화해야 한다는 사실에서 비롯됩니다.

XmlInclude 특성을 사용하면 어떤 구체적인 클래스가 인터페이스를 구현하는지 직렬 변환기에 알릴 수 있습니다.

IMessageHeader를 구현하고 MarshalByRefObject도 상속하는 추상 기본 클래스를 만들 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top