Tôi nhận thấy một hành vi kỳ lạ với XmlSerializer và danh sách chung (cụ thể là List<int>
). Tôi đã tự hỏi nếu có ai đã nhìn thấy điều này trước hoặc biết những gì đang xảy ra. Nó xuất hiện như thể serialization hoạt động tốt nhưng deserialization muốn thêm các mục bổ sung vào danh sách. Mã bên dưới minh họa sự cố.Deserializing List <int> với XmlSerializer Gây thêm các mục
lớp Serializable: Mã
public class ListTest
{
public int[] Array { get; set; }
public List<int> List { get; set; }
public ListTest()
{
Array = new[] {1, 2, 3, 4};
List = new List<int>(Array);
}
}
Test:
ListTest listTest = new ListTest();
Debug.WriteLine("Initial Array: {0}", (object)String.Join(", ", listTest.Array));
Debug.WriteLine("Initial List: {0}", (object)String.Join(", ", listTest.List));
XmlSerializer serializer = new XmlSerializer(typeof(ListTest));
StringBuilder xml = new StringBuilder();
using(TextWriter writer = new StringWriter(xml))
{
serializer.Serialize(writer, listTest);
}
Debug.WriteLine("XML: {0}", (object)xml.ToString());
using(TextReader reader = new StringReader(xml.ToString()))
{
listTest = (ListTest) serializer.Deserialize(reader);
}
Debug.WriteLine("Deserialized Array: {0}", (object)String.Join(", ", listTest.Array));
Debug.WriteLine("Deserialized List: {0}", (object)String.Join(", ", listTest.List));
gỡ lỗi đầu ra:
Initial Array: 1, 2, 3, 4
Initial List: 1, 2, 3, 4
XML:
<?xml version="1.0" encoding="utf-16"?>
<ListTest xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Array>
<int>1</int>
<int>2</int>
<int>3</int>
<int>4</int>
</Array>
<List>
<int>1</int>
<int>2</int>
<int>3</int>
<int>4</int>
</List>
</ListTest>
Deserialized Array: 1, 2, 3, 4
Deserialized List: 1, 2, 3, 4, 1, 2, 3, 4
Lưu ý rằng cả mảng và danh sách dường như đã được tuần tự hóa thành XML một cách chính xác nhưng trên deserialization mảng xuất hiện chính xác nhưng danh sách trở lại với một tập hợp các mục trùng lặp. Bất kỳ ý tưởng?
Cảm ơn câu trả lời - như tôi đã đề cập trong một chú thích dưới đây, tôi đã không nhận ra deserializer đã có thể đột biến tình trạng của các thành viên trong deserialization (trong hầu hết trường hợp tôi nghĩ rằng nó chỉ đặt những giá trị mới, phải không?). Danh sách là lớp duy nhất nó có thể làm điều này với? Có một số tham chiếu cho biết các lớp deserializer có thể đột biến không? –
daveaglick