Tôi có một lớp sưu tập thực hiện IEnumerable và tôi đang gặp sự cố khi deserializing một phiên bản serialized của cùng. Tôi đang sử dụng Json.net v 4.0.2.13623Tuần tự hóa Json.net của bộ sưu tập tùy chỉnh thực hiện IEnumerable <T>
Đây là một phiên bản đơn giản hơn của lớp bộ sưu tập của tôi để minh họa vấn đề của tôi
public class MyType
{
public int Number { get; private set; }
public MyType(int number)
{
this.Number = number;
}
}
public class MyTypes : IEnumerable<MyType>
{
private readonly Dictionary<int, MyType> c_index;
public MyTypes(IEnumerable<MyType> seed)
{
this.c_index = seed.ToDictionary(item => item.Number);
}
public IEnumerator<MyType> GetEnumerator()
{
return this.c_index.Values.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return this.GetEnumerator();
}
public int CustomMethod()
{
return 1; // Just for illustration
}
}
Khi tôi serialize nó tôi nhận được json sau
[
{
"Number": 1
},
{
"Number": 2
}
]
Nhưng sau đó khi tôi cố gắng deserialize tôi nhận được ngoại lệ sau System.Exception: Không thể tạo và điền loại danh sách MyTypes
cũng có t Ried sử dụng gợi ý serialization nhưng đã không thành công
Đây là những chức năng kiểm tra tôi đã sử dụng
public void RoundTrip()
{
var _myTypes1 = new MyTypes(new[] { new MyType(1), new MyType(2) });
var _jsonContent = JsonConvert.SerializeObject(_myTypes1, Formatting.Indented);
var _myTypes2 = JsonConvert.DeserializeObject<MyTypes>(_jsonContent);
}
public void RoundTripWithSettings()
{
var _myTypes1 = new MyTypes(new[] { new MyType(1), new MyType(2) });
var _serializationSettings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Arrays };
var _jsonContent = JsonConvert.SerializeObject(_myTypes1, Formatting.Indented, _serializationSettings);
var _myTypes2 = JsonConvert.DeserializeObject<MyTypes>(_jsonContent, _serializationSettings);
}
Có ai quản lý để serialize đối tượng bộ sưu tập của riêng mình?
Cảm ơn trước
Pat
Bạn nên nối tiếp và deserialise vào bộ sưu tập cụ thể như Danh sách thay vì IEnumerable . Để deserialise một cái gì đó, nó cần một thực hiện hơn là chỉ là một giao diện. –
Deleted
Chris, Thay đổi thành phân lớp ReadOnlyCollection với một số thay đổi khác nhưng tôi có thể biết deserialize bộ sưu tập –
pmcgrath
Thực ra bạn cũng có thể sử dụng IList. Nó sẽ tạo một Danh sách cho bạn. Nhưng không có bộ sưu tập mặc định được xác định cho IEnumerable . –
Mithon