Cách đơn giản nhất để nhận XmlSerializer cũng như tuần tự hóa các thuộc tính private và "public const" của một lớp hoặc cấu trúc là gì? Không phải tất cả nó sẽ cho tôi là những thứ chỉ công khai. Làm cho nó riêng tư hoặc thêm const là gây ra các giá trị không được serialized.Sử dụng XmlSerializer với các thuộc tính const riêng và công khai
Trả lời
XmlSerializer
chỉ xem xét các trường và thuộc tính công khai. Nếu bạn cần kiểm soát nhiều hơn, bạn có thể thực hiện IXmlSerializable và tuần tự hóa bất cứ điều gì bạn muốn. Tất nhiên, serializing một hằng số không có ý nghĩa nhiều vì bạn không thể deserialize đến một hằng số.
Kiểm tra DataContractSerializer, được giới thiệu trong .NET 3.0. Nó cũng sử dụng định dạng XML và theo nhiều cách, nó tốt hơn XmlSerializer, bao gồm cả việc xử lý dữ liệu riêng tư. Xem http://www.danrigsby.com/blog/index.php/2008/03/07/xmlserializer-vs-datacontractserializer-serialization-in-wcf/ để so sánh đầy đủ.
Nếu bạn chỉ có .NET 2.0, có BinarySerializer có thể xử lý dữ liệu riêng tư, nhưng tất nhiên đó là định dạng nhị phân.
'Tốt hơn' là gây tranh cãi, ví dụ , DataContractSerializer không cung cấp cho bạn bất kỳ sự linh hoạt nào về cách đối tượng được tuần tự hóa. – nicodemus13
Bạn không nên xem xét const
thành viên vì chúng không phải là ví dụ; nhưng nếu bạn chỉ có nghĩa là các thành viên không công khai: xem xét DataContractSerializer
(.NET 3.0) - điều này tương tự như XmlSerializer
, nhưng có thể tuần tự hóa các thuộc tính không công khai (mặc dù nó là "chọn tham gia").
Xem here for more.
Việc tuần tự hóa giá trị của hằng số cho một thời gian chạy cụ thể tạo ra nhiều ý nghĩa, ví dụ, nếu nó được so sánh với giá trị trong một thời gian chạy khác. – Grault
@Jesdisciple không thực sự - bởi vì một lần nữa: đây là một đối tượng (ví dụ) serializer - và giá trị đó không thuộc về đối tượng (ví dụ). –
Mặc dù nó không thể serialize tài sản riêng, bạn có thể serialize các thuộc tính với một setter nội bộ, như thế này:
public string Foo { get; internal set; }
Để làm điều đó, bạn cần phải sẵn tạo lắp ráp tuần tự với sgen. exe, và tuyên bố lắp ráp này làm bạn:
[assembly:InternalsVisibleTo("MyAssembly.XmlSerializers")]
Một giải pháp khác là sử dụng Newtonsoft.Json:
var json = Newtonsoft.Json.JsonConvert.SerializeObject(new { root = result });
var xml = (XmlDocument)Newtonsoft.Json.JsonConvert.DeserializeXmlNode(json);
Chắc chắn, điều này đã không may đường vòng qua json.
Đây là giải pháp của tôi để đặt giá trị bất biến trong một tài sản đó sẽ serialize đến XML:
[XmlElement]
public string format { get { return "Acme Order Detail XML v3.4.5"; } set { } }
Tại sao bạn muốn hằng số để được serialized ?! Dường như bạn đang đi sai đường. –
Theo định nghĩa, các hằng số được tiếp xúc (tức là công cộng và được bảo vệ) là một thứ không bao giờ thay đổi. Thay đổi một hằng số công khai là một thay đổi đột phá của khách hàng! Đối với một cái gì đó mà chỉ đơn thuần là hằng số cho việc chạy ứng dụng, hoặc cho một phiên bản cụ thể của ứng dụng, nhưng có thể thay đổi trong tương lai, bạn cần sử dụng các trường 'readonly'. 'XmlSerializer' sẽ không xử lý chúng, nhưng đó là một vấn đề khác. –
Nếu bạn muốn tuần tự hóa/deserialize thành viên tư nhân xin vui lòng xem http://stackoverflow.com/questions/420662/can-an-internal-setter-of-a-property-be-serialized –