From 51aa72b4631d36a332fa6d80e7919b334e2506fc Mon Sep 17 00:00:00 2001 From: Sebastian Wittlich Date: Mon, 11 May 2026 16:34:22 +0200 Subject: [PATCH] Fix #228 --- src/OneWare.Core/Dock/OneWareDockSerializer.cs | 9 ++++++++- .../Dock/SilentErrorSerializationBinder.cs | 18 ++++++++++++++++++ src/OneWare.Core/Services/MainDockService.cs | 4 ++-- 3 files changed, 28 insertions(+), 3 deletions(-) create mode 100644 src/OneWare.Core/Dock/SilentErrorSerializationBinder.cs diff --git a/src/OneWare.Core/Dock/OneWareDockSerializer.cs b/src/OneWare.Core/Dock/OneWareDockSerializer.cs index e185d8027..d7dc6b1a3 100644 --- a/src/OneWare.Core/Dock/OneWareDockSerializer.cs +++ b/src/OneWare.Core/Dock/OneWareDockSerializer.cs @@ -1,6 +1,7 @@ using System.Collections.ObjectModel; using System.Text; using Dock.Model.Core; +using Microsoft.Extensions.Logging; using Newtonsoft.Json; using Newtonsoft.Json.Converters; @@ -10,7 +11,7 @@ public sealed class OneWareDockSerializer : IDockSerializer { private readonly JsonSerializerSettings _settings; - public OneWareDockSerializer(IServiceProvider provider) + public OneWareDockSerializer(IServiceProvider provider, ILogger logger) { _settings = new JsonSerializerSettings { @@ -20,10 +21,16 @@ public OneWareDockSerializer(IServiceProvider provider) ReferenceLoopHandling = ReferenceLoopHandling.Serialize, ContractResolver = new OneWareContractResolver(typeof(ObservableCollection<>), provider), NullValueHandling = NullValueHandling.Ignore, + SerializationBinder = new SilentErrorSerializationBinder(), Converters = { new NoSerializeLayoutListConverter(), new KeyValuePairConverter() + }, + Error = (sender, args) => + { + logger.LogError($"JSON Deserialization Error at {args.ErrorContext.Path}: {args.ErrorContext.Error.Message}"); + args.ErrorContext.Handled = true; } }; } diff --git a/src/OneWare.Core/Dock/SilentErrorSerializationBinder.cs b/src/OneWare.Core/Dock/SilentErrorSerializationBinder.cs new file mode 100644 index 000000000..6d34f2a39 --- /dev/null +++ b/src/OneWare.Core/Dock/SilentErrorSerializationBinder.cs @@ -0,0 +1,18 @@ +using Newtonsoft.Json.Serialization; + +namespace OneWare.Core.Dock; + +public class SilentErrorSerializationBinder : DefaultSerializationBinder +{ + public override Type BindToType(string? assemblyName, string typeName) + { + try + { + return base.BindToType(assemblyName, typeName); + } + catch + { + return null; + } + } +} \ No newline at end of file diff --git a/src/OneWare.Core/Services/MainDockService.cs b/src/OneWare.Core/Services/MainDockService.cs index b47606bf6..ea8220e41 100644 --- a/src/OneWare.Core/Services/MainDockService.cs +++ b/src/OneWare.Core/Services/MainDockService.cs @@ -44,13 +44,13 @@ public class MainDockService : Factory, IMainDockService public MainDockService(ICompositeServiceProvider serviceProvider, IPaths paths, IWindowService windowService, IApplicationStateService applicationStateService, WelcomeScreenViewModel welcomeScreenViewModel, IFileWatchService fileWatchService, - MainDocumentDockViewModel mainDocumentDockViewModel) + MainDocumentDockViewModel mainDocumentDockViewModel, ILogger logger) { _paths = paths; _welcomeScreenViewModel = welcomeScreenViewModel; _mainDocumentDockViewModel = mainDocumentDockViewModel; _fileWatchService = fileWatchService; - _serializer = new OneWareDockSerializer(serviceProvider); + _serializer = new OneWareDockSerializer(serviceProvider, logger); _documentViewRegistrations.Add("*", typeof(EditViewModel));