Tôi đã có mã này:Bỏ qua loại chưa biết khi deserializing xml
[XmlType("Metadata")]
[Serializable]
public class MetadataContainer : List<MetadataBase>
{
}
[XmlType("Meta")]
[XmlInclude(typeof(ReadonlyMetadata))]
[Serializable]
public abstract class MetadataBase
{
}
[XmlType("Readonly")]
[Serializable]
public class ReadonlyMetadata : MetadataBase
{
}
[TestFixture]
public class SerializationTests
{
[Test]
public void Can_deserialize_with_known_type()
{
const string text = @"<Metadata xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"">
<Meta xsi:type=""Readonly"" />
</Metadata>";
var serializer = new XmlSerializer(typeof(MetadataContainer));
var metas = (MetadataContainer)serializer.Deserialize(XmlReader.Create(new StringReader(text)));
Assert.That(metas.Count, Is.EqualTo(1));
Assert.That(metas.First(), Is.InstanceOf<ReadonlyMetadata>());
}
[Test]
public void Can_deserialize_with_unknown_type()
{
const string text = @"<Metadata xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"">
<Meta xsi:type=""Hello"" />
</Metadata>";
var serializer = new XmlSerializer(typeof(MetadataContainer));
var metas = (MetadataContainer)serializer.Deserialize(XmlReader.Create(new StringReader(text)));
Assert.That(metas.Count, Is.EqualTo(0));
}
}
Các thử nghiệm đầu tiên hoạt động, nhưng khi tôi chạy thứ hai tôi nhận được lỗi này:
System.InvalidOperationException : There is an error in XML document (2, 9). ----> System.InvalidOperationException : The specified type was not recognized: name='Hello', namespace='', at .
Thay vì nhận được này lỗi Tôi muốn nó bỏ qua các loại không được công nhận. Có cách nào để làm điều này không?
Tôi nghĩ đây sẽ là một trường hợp đăng ký vào một hoặc nhiều của [ 'sự kiện Unknown'-] (http://msdn.microsoft.com/en-us/ thư viện/0a51hxdw.aspx), nhưng trên thử nó có vẻ như không giúp đỡ. Bí ẩn. – AakashM
Tôi cũng nghĩ rằng, kết quả là đáng sợ mặc dù. Mặc dù vậy, tôi đã không tìm được giải pháp. – flindeberg