Sửa Mã này nên minh họa toàn bộ vấn đề:Tại sao XmlSerializer có thể tuần tự hóa các lớp trừu tượng chứ không phải giao diện?
[XmlInclude(typeof(AThing1))]
public abstract class AThing
{
public abstract string Name { get; set; }
}
[XmlInclude(typeof(IThing1))]
public interface IThing
{
string Name { get; set; }
}
public class AThing1 : AThing
{
public override string Name { get; set; }
}
public class IThing1 : IThing
{
public string Name { get; set; }
}
List<AThing> aThings = new List<AThing>(new AThing[] { new AThing1() { Name = "Bob" } });
List<IThing> iThings = new List<IThing>(new IThing[] { new IThing1() { Name = "Bob" } });
public void Test()
{
using (StringWriter sw = new StringWriter())
{
XmlSerializer aSerializer = new XmlSerializer(typeof(List<AThing>));
aSerializer.Serialize(sw, aThings);
string text = sw.ToString();
}
using (StringWriter sw = new StringWriter())
{
// This line will throw "Cannot serialize interface IThing.":
XmlSerializer iSerializer = new XmlSerializer(typeof(List<IThing>));
iSerializer.Serialize(sw, iThings);
string text = sw.ToString();
}
}
Đầu tiên text
tạo ra bởi aSerializer
sẽ là:
<?xml version="1.0" encoding="utf-16"?>
<ArrayOfAThing xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<AThing xsi:type="AThing1">
<Name>Bob</Name>
</AThing>
</ArrayOfAThing>
Tôi không thấy lý do tại sao không thể iSerializer
làm điều này:
<?xml version="1.0" encoding="utf-16"?>
<ArrayOfIThing xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<IThing xsi:type="IThing1">
<Name>Bob</Name>
</IThing>
</ArrayOfIThing>
thay vì ném ngoại lệ.
Bạn đã cố gắng biên dịch mã của mình chưa? Tôi không nghĩ rằng đoạn mã trên sẽ biên dịch. Ngoài ra, xin vui lòng gửi mã bạn sử dụng để serialize. Nó sẽ làm cho nó dễ dàng hơn nhiều để minh họa cho vấn đề là gì. –
@JohnSaunders: Xem cập nhật của tôi Tôi nghĩ rằng nó nên được khá rõ ràng bây giờ. – Juan
Đối với hồ sơ, ngoại lệ hoàn chỉnh bạn nhận được là gì? –