다른 유형과 null
값의 개체를 포함 할 수있는 목록이 있습니다 . 클래스를 XML로 직렬화 할 때 이러한 null
값 을 유지하고 싶지만 자동으로 제거됩니다. 의 설정 IsNullable = true
은 XmlArrayItem attribute
아무것도 변경하지 않았습니다.
다음과 같은 단순화 된 클래스 구조가 있습니다.
public class MyClass
{
[XmlArray("Items")]
[XmlArrayItem("TypeA", typeof(A), IsNullable = true)]
[XmlArrayItem("TypeB", typeof(B), IsNullable = true)]
public ObservableCollection<Base> MyCollection { get; set; }
}
public class Base
{
}
public class A : Base
{
}
public class B : Base
{
}
앞서 말했듯이, MyCollection
두 가지 유형의 객체를 포함 할 수 있지만 null
값 도 포함 할 수 있습니다 (예 : 인덱스 0 및 2).
이것은 내 직렬화 코드입니다.
var myClass = new MyClass();
myClass.MyCollection = new ObservableCollection<Base>
{
null,
new A(),
null,
new B()
};
var stream = new FileStream("C:\\temp\\test.xml", FileMode.Create);
var serializer = new XmlSerializer(typeof (MyClass));
serializer.Serialize(stream, myClass);
다음 XML 출력을 얻습니다.
<?xml version="1.0"?>
<MyClass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Items>
<TypeA />
<TypeB />
</Items>
</MyClass>
목록에서 null 값을 어떻게 유지할 수 있습니까? 잠시 동안 검색했지만 null 속성을 제거하는 방법 만 찾았습니다.
흠, 실제로 IsNullable 속성을 사용하여 XmlArrayItem을 작업하는 데 성공하지 못했지만 약간 다른 XML 출력이 마음에 들지 않으면 시도해 볼 수 있습니다.
public class MyClass
{
[XmlArray("Items", IsNullable = true)]
public ObservableCollection<Base> MyCollection { get; set; }
}
[XmlInclude(typeof(A))]
[XmlInclude(typeof(B))]
public class Base
{
}
[XmlType("TypeA")]
public class A : Base
{
}
[XmlType("TypeB")]
public class B : Base
{
}
public static void Test()
{
var myClass = new MyClass() { MyCollection = new ObservableCollection<Base> { new A(), null, new B(), null } };
var wtr = new StreamWriter("C:\\avp\\test.xml");
var s = new XmlSerializer(typeof(MyClass));
s.Serialize(wtr, myClass);
wtr.Close();
}
그런 다음 해당 출력을 얻을 수 있습니다.
<MyClass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Items>
<Base xsi:type="TypeA" />
<Base xsi:nil="true" />
<Base xsi:type="TypeB" />
<Base xsi:nil="true" />
</Items>
</MyClass>
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다