Giả sử tôi phải sắp xếp thứ tự một đối tượng của một lớp Ô tô ở các cấp, ví dụ: Nội bộ và Công cộng. Một số thuộc tính ở cấp Công cộng không được tuần tự hóa vì chúng là nội bộ.Quyết định các thuộc tính nào được tuần tự hóa tại thời gian chạy
Tại thời điểm này cách 'dễ nhất' tôi có thể nghĩ ra để đạt được điều này là sử dụng thừa kế:
class CarPublic {
public int PropX {get;set}
}
class CarInternal: CarPublic {
public string PropY {get;set}
}
Sau đó, tôi có thể
object ToSerialize() {
CarInternal car = GetCar();
if(level == Level.Public) {
return car as CarPublic;
} else {
return car;
}
}
Kết quả của ToSerialize() được thực hiện bởi một khuôn khổ (tôi không có kiểm soát) và được tuần tự hóa thành JSON hoặc XML.
Tôi bỏ qua các thuộc tính tuần tự hóa XML để đơn giản.
Điều này giống như một hack và hack chỉ đưa bạn đến nay. Có cách nào tốt hơn (cách nào?) Để đạt được điều này?
Tôi nghĩ rõ ràng bây giờ, nhưng tôi muốn tránh viết các phương thức tuần tự hóa riêng của mình cho JSON và XML.
Cảm ơn trước Tymek
EDIT ==
Để làm rõ, tôi muốn để có thể serialize nhiều cấp độ:
class Car0 {
public int PropA {get;set}
}
class Car1: Car0 {
public string PropB {get;set}
}
class Car2: Car1 {
public int PropC {get;set}
}
class Car3: Car2 {
public string PropD {get;set}
}
và
object ToSerialize(Level level) {
Car3 car = GetCar();
switch(level) {
case Level.Zero: return car as Car0;
case Level.One: return car as Car1;
case Level.Two: return car as Car3;
case Level.Three: return car as Car4;
}
return null;
}
== Cách tiếp cận được chọn
Tôi đã đánh dấu câu trả lời của Marc Gravell là câu trả lời, vì nó cung cấp thông tin chung về cách C# và các thành phần 'chuẩn' hỗ trợ những gì tôi đã yêu cầu. Tuy nhiên, tôi nghĩ cách tiếp cận tốt nhất cho vấn đề của tôi là sử dụng các lớp proxy như được trình bày ở trên và có lớp được sắp xếp theo kiểu đa cấp này với các phương pháp như được hiển thị bên dưới. Hình minh hoạ.
public interface ICar {
Car0 As0();
Car1 As1();
Car2 As2();
Car3 As3();
...
}
này cho phép giữ Car0..3 lớp rất đơn giản, chỉ với tài sản, để duy trì và hiểu được.
Viết các phương thức tuần tự hóa tùy chỉnh là cách tốt hơn mà tôi biết (và thực sự không phải là điều khó khăn). Bạn có yêu cầu serialization tùy chỉnh mà chính nó cho một serializer tùy chỉnh ... Có một lý do cụ thể mà bạn không muốn đi xuống con đường đó? – Bill
Lý do chính là tôi đang ở trong môi trường khung nơi việc tuần tự hóa nên được thực hiện bởi khung công tác và tôi chỉ trả lại kết quả dưới dạng đối tượng. – mayu
Bạn có thể thấy những lớp khác trong môi trường này đang làm gì để giải quyết vấn đề này không? Nếu bạn định hack nó thành từng mảnh, cũng có thể hack nó theo cách tương tự như những người khác có :) – Bill