Всем доброго времени суток, друзья.
Есть проект, в котором подключаются dll фигур с помощью рефлексии. При сериализации подключены все библиотеки, однако при десериализации одну из них удалили. Как сделать, чтобы десериализатор пропускал тип элементов, которого более нет и продолжал корректную работу с остальными?
using (BsonReader reader = new BsonReader(ms))
{
var serializer = JsonSerializer.Create(new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.Objects,
});
shapeCollection.Set(serializer.Deserialize
При такой записи возникает ошибка:
Newtonsoft.Json.JsonSerializationException: "Error resolving type specified in JSON 'labN1.Rectangle, Rectangle'. Path 'ShapeList[1].$type'."
Внутреннее исключение:
JsonSerializationException: Could not load assembly 'Rectangle'.
Рассмотрено на примере удаления библиотеки Rectangle.dll.
Возможно я что-то напутал, так как:
try
{
Assembly a = Assembly.Load("аRectangle");
Type type = a.GetType("labN1.FactoryMethodes.RectangleFactory");
object obj = Activator.CreateInstance(type);
MethodInfo rectangleFactory = type.GetMethod("CreateObject");
object value = rectangleFactory.Invoke(obj, new object[] { new[] { 120, 30,
40, 50, (Object)Color.Black, 2 } });
shapeCollection.ShapeList.Add((Shape)value);
types.Add(value.ToString());
}
catch
{
MessageBox.Show("Rectangle.dll не подключена.");
}
Если допустить ошибку при подключении библиотеки Rectangle.dll ("aRectangle"), а саму библиотеку не удалять, то все будет работать без ошибок, но десериализовывать Rectangle. Которые, впрочем, затем можно удалить.
Ответ
Написал через JSON, на выходе получилось 2 метода.
Суть:
1) Сериализую каждый объект на новую строку.
2) Читаю строку и пытаюсь ее десериализовать.
3) Если десериализация успешна, то заношу в list, иначе обрабатываю исключение
и перехожу к пункту 2
public void SerializeToJson(String path)
{
ShapeCollection shapeCollection = ShapeCollection.Instance();
foreach (Shape shape in shapeCollection.ShapeList)
{
var settings = new JsonSerializerSettings
{TypeNameHandling = TypeNameHandling.Objects};
File.AppendAllText(@path, JsonConvert.SerializeObject(shape, settings));
File.AppendAllText(@path, "
");
}
}
public void DeserializeFromJson(String path)
{
ShapeCollection shapeCollection = ShapeCollection.Instance();
shapeCollection.ShapeList.Clear();
shapeCollection = ShapeCollection.Instance();
String line;
using (StreamReader sr = new StreamReader(@path))
{
while (sr.Peek() >= 0)
{
line = sr.ReadLine();
try
{
var settings = new JsonSerializerSettings
{TypeNameHandling = TypeNameHandling.Objects};
var shape = JsonConvert.DeserializeObject
Комментариев нет:
Отправить комментарий