2009-05-18 32 views

Trả lời

50

Biểu đồ đối tượng không phải là một đối tượng duy nhất, mà là một tập hợp các đối tượng liên quan. Ví dụ đơn giản, hãy xem xét:

public class Node { 
    public string Name {...} 
    public Node Parent {...} 
    public List<Node> Children {...} 
} 

nơi mỗi đứa trẻ biết về cha mẹ (và cha mẹ biết về trẻ).

Vấn đề là xml đó là một cây dựa trên thuộc tính đối tượng ... và nó muốn chỉ hướng dẫn họ - tức là với phụ huynh đơn giản/con:

  • A (biết rằng B là con của nó)
    • B (biết rằng A là mẹ của nó)

rằng sẽ serialize như:

<Node> 
    <Name>A</Name> 
    <!-- no Parent as A is the top node, so null --> 
    <Children> 
    <Node> 
     <Name>B</Name> 
     <Parent> 
      <Node> 
       <Name>A</Name> 
       *** boom *** 

Bạn có thể thấy rằng chúng tôi đã quay lại A, vì vậy chúng tôi hiện đang trong vòng lặp vô tận.

XmlSerializer có thể tuần tự hóa cây dữ liệu, nhưng không phải là biểu đồ đầy đủ. Bạn có thể đánh dấu các thuộc tính để bỏ qua, ví dụ:

[XmlIgnore] 
public Node Parent {...} 

Và bây giờ nó sẽ hoạt động, nhưng chúng tôi sẽ phải sửa lại Parent sau đó.

Ngược lại, một số trình nối tiếp khác có thể xử lý đồ thị (DataContractSerializer có thể theo yêu cầu). Nó thực hiện điều này bằng cách theo dõi các đối tượng chống lại một khóa duy nhất - nhưng sau đó đầu ra không phải là những gì bạn mong đợi từ xml thông thường.

9

Biểu đồ đối tượng là tập hợp các đối tượng tham chiếu lẫn nhau.

Việc tuần tự hóa biểu đồ đối tượng là khó khăn. Bộ nối tiếp sẽ phải gán một ID duy nhất cho mọi đối tượng và sau đó thay thế các tham chiếu bằng các ID duy nhất.

Nếu nó đang được tuần tự hóa ở định dạng XML và xử lý đồ thị đối tượng, nó sẽ phải thêm thuộc tính "OBJECT_ID" (hoặc một số tên khác) vào mọi phần tử. Điều này sẽ rất dễ dàng để phá vỡ: điều gì sẽ xảy ra nếu bạn thêm một thuộc tính có cùng tên cho lớp bạn đang sắp xếp?

Giải pháp đơn giản nhất là không hỗ trợ nó.

.NET cung cấp tuần tự hóa nhị phân liên quan đến vấn đề này cũng như vấn đề tham chiếu vòng tròn.

5

Một đối tượng chung graph bao gồm một tập hợp các đối tượng giữ tham chiếu với nhau. Nếu bạn có một cây đối tượng không có các liên kết ngược, việc tuần tự hóa và deserialization rất đơn giản. Với một đồ thị chung, quá trình tuần tự (de) cần phải theo dõi danh tính của từng đối tượng và sử dụng một số thuật toán đánh dấu và quét để đảm bảo rằng các đối tượng không được (de) tuần tự hóa hai lần.

Các vấn đề liên quan