Страницы

Поиск по вопросам

суббота, 13 июля 2019 г.

Десериализация Bson c# и динамическое подключение dll библиотек

Всем доброго времени суток, друзья. Есть проект, в котором подключаются dll фигур с помощью рефлексии. При сериализации подключены все библиотеки, однако при десериализации одну из них удалили. Как сделать, чтобы десериализатор пропускал тип элементов, которого более нет и продолжал корректную работу с остальными?
using (BsonReader reader = new BsonReader(ms)) { var serializer = JsonSerializer.Create(new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Objects, }); shapeCollection.Set(serializer.Deserialize(reader)); }
При такой записи возникает ошибка:
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(line, settings); shapeCollection.ShapeList.Add((Shape)shape); } catch { } } } }

Комментариев нет:

Отправить комментарий