XmlInclude 또는 SoapInclude 특성을 사용하여 정적으로 알려지지 않은 형식을 지정합니다.
.NET의 .NET으로 작업 할 때 매우 이상한 문제가 XmlSerializer
있습니다.
다음 예제 클래스를 사용하십시오.
public class Order
{
public PaymentCollection Payments { get; set; }
//everything else is serializable (including other collections of non-abstract types)
}
public class PaymentCollection : Collection<Payment>
{
}
public abstract class Payment
{
//abstract methods
}
public class BankPayment : Payment
{
//method implementations
}
AFAIK, InvalidOperationException
파생 된 .NET Framework 형식에 대해 알지 못하는 serializer로 인해 발생하는 문제를 해결하는 방법에는 세 가지가 Payment
있습니다.
1. 추가 XmlInclude
받는 Payment
클래스 정의 :
모든 클래스가 내가 제어 할 수없는 외부 참조로 포함되어 있기 때문에 불가능합니다.
2. XmlSerializer
인스턴스 생성 중 파생 된 유형의 유형 전달
작동하지 않습니다.
3. XmlAttributeOverrides
속성의 기본 직렬화를 재정의하기 위해 대상 속성 정의 ( 이 SO 게시물에 설명 됨 )
또한 작동하지 않습니다 ( XmlAttributeOverrides
초기화가 이어짐).
Type bankPayment = typeof(BankPayment);
XmlAttributes attributes = new XmlAttributes();
attributes.XmlElements.Add(new XmlElementAttribute(bankPayment.Name, bankPayment));
XmlAttributeOverrides overrides = new XmlAttributeOverrides();
overrides.Add(typeof(Order), "Payments", attributes);
XmlSerializer
그런 다음 적절한 생성자가 사용됩니다.
참고 : 작동하지 않음 은 InvalidOperationException
( BankPayment
예상되지 않았습니다 ... )가 발생 한다는 것을 의미합니다 .
누구든지 주제에 대해 밝힐 수 있습니까? 어떻게 문제를 해결하고 디버깅 할 수 있을까요?
이것은 나를 위해 일했습니다.
[XmlInclude(typeof(BankPayment))]
[Serializable]
public abstract class Payment { }
[Serializable]
public class BankPayment : Payment {}
[Serializable]
public class Payments : List<Payment>{}
XmlSerializer serializer = new XmlSerializer(typeof(Payments), new Type[]{typeof(Payment)});
문제를 해결했습니다. 잠시 동안 파헤쳐 본 후 똑같은 상황을 다루는 이 게시물 을 찾았 습니다 . 그것은 나를 올바른 길로 인도했습니다.
기본적으로 파생 클래스가 추가 형식으로 포함 된 경우XmlSerializer
기본 네임 스페이스를 알아야합니다 . 이것이 발생해야하는 정확한 이유는 아직 알려지지 않았지만 여전히 직렬화가 작동하고 있습니다.
Base on this I was able to solve this by changing the constructor of XmlSerializer
I was using instead of changing the classes.
Instead of using something like this (suggested in the other answers):
[XmlInclude(typeof(Derived))]
public class Base {}
public class Derived : Base {}
public void Serialize()
{
TextWriter writer = new StreamWriter(SchedulePath);
XmlSerializer xmlSerializer = new XmlSerializer(typeof(List<Derived>));
xmlSerializer.Serialize(writer, data);
writer.Close();
}
I did this:
public class Base {}
public class Derived : Base {}
public void Serialize()
{
TextWriter writer = new StreamWriter(SchedulePath);
XmlSerializer xmlSerializer = new XmlSerializer(typeof(List<Derived>), new[] { typeof(Derived) });
xmlSerializer.Serialize(writer, data);
writer.Close();
}
'development' 카테고리의 다른 글
일반 생성 (0) | 2020.09.25 |
---|---|
값이 설정되고 null인지 확인 (0) | 2020.09.25 |
Celery vs. RQ 사용의 장단점 (0) | 2020.09.25 |
(inf + 0j) * 1이 inf + nanj로 평가되는 이유는 무엇입니까? (0) | 2020.09.25 |
JUnit 테스트 클래스에서 log4j를 어디에서 구성합니까? (0) | 2020.09.25 |