Skip to content

Commit 9e6a501

Browse files
committed
fix: InvalidOperationException from RecipeService.Search()
Context: #1726 Context: #1728 Build and run `Chefs.csproj` for e.g. net10.0-desktop and NativeAOT while using Uno 6.6.0-dev.3: sed -i '' 's/"Uno.Sdk": ".*"/"Uno.Sdk": "6.6.0-dev.3"/g' global.json git clean -xdf Chefs{,.Api} dotnet publish -c Release -r osx-x64 -f net10.0-desktop -p:TargetFrameworkOverride=net10.0-desktop \ -bl Chefs/Chefs.csproj -p:UseSkiaRendering=true -p:SkiaPublishAot=true \ -p:SkiaPublishAot=true \ -p:IlcGenerateMapFile=true -p:IlcGenerateMstatFile=true -p:IlcGenerateDgmlFile=true -p:IlcGenerateMetadataLog=true \ -p:EmitCompilerGeneratedFiles=true -p:CompilerGeneratedFilesOutputPath=`pwd`/_gen Chefs/bin/Release/net10.0-desktop/osx-x64/publish/Chefs From the launch screen: 1. Click **Skip** 2. Click ** Sign in with Apple** 3. Click **🔍Search** on the left 4. In the Search box, type `m` When doing this with e838af9, the search results screen shows: > An error occurred. ![Search Results > An error occurred][0] …which isn't particularly helpful. If you do all this with #1728 applied, the Console log shows: fail: Chefs.Business.Services.Recipes.RecipeService[0] Failed to search recipes with term m System.InvalidOperationException: Reflection-based serialization has been disabled for this application. Use the IServiceCollection.AddJsonTypeInfo() or IHostBuilder.UseSerialization(IHostBuilder, IEnumerable<IJsonTypeInfoResolver>, Action<IServiceCollection>) extension methods to enable JSON deserialization for type `System.Collections.Generic.Dictionary`2[[System.String, System.Private.CoreLib, Version=10.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[Chefs.Business.Models.SearchHistory, Chefs, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]`. at Uno.Extensions.Serialization.SystemTextJsonSerializer.FromStream(Stream, Type) + 0x88 at Uno.Extensions.Serialization.SerializerExtensions.FromStream[T](ISerializer, Stream) + 0x34 at Uno.Extensions.Configuration.WritableOptions`1.<UpdateAsync>d__10.MoveNext() + 0x292 --- End of stack trace from previous location --- at Chefs.Business.Services.Recipes.RecipeService.<SaveSearchHistory>d__51.MoveNext() + 0x5d --- End of stack trace from previous location --- at Chefs.Business.Services.Recipes.RecipeService.<SearchCore>d__24.MoveNext() + 0x8a --- End of stack trace from previous location --- at Chefs.Business.Services.Recipes.RecipeService.<Search>d__23.MoveNext() + 0x175 which shows what the problem is: `RecipeService.Search()` tries to save the search history, but JSON serialization does not support `Dictionary<string, SearchHistory>`, so an `InvalidOperationException` is thrown. (Unfortunately the exception is basically swallowed; PR #1728 adds logging to that code path, and was needed to diagnose this issue.) Update `MockEndpointContext` to emit JSON serialization metadata for `Dictionary<string, SearchHistory>`, so that Search now works. [0]: https://private-user-images.githubusercontent.com/155958/541004949-2be43b36-4eb1-42b1-b91d-e53a5e5545de.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Njk1NDE0NjMsIm5iZiI6MTc2OTU0MTE2MywicGF0aCI6Ii8xNTU5NTgvNTQxMDA0OTQ5LTJiZTQzYjM2LTRlYjEtNDJiMS1iOTFkLWU1M2E1ZTU1NDVkZS5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjYwMTI3JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI2MDEyN1QxOTEyNDNaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT0yZDlkNzA5OTM0NzI2NWMxMjg4Njc0MTVmNWMyNjkzYTQzY2MzYWIxYTAzNGRlZjE5NjlmN2FjNzRkOGIxYjJiJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.a2gF7zICQIBUqWB-qdZv58UDg_DIwzKWAD8pNKJtu_g
1 parent e838af9 commit 9e6a501

File tree

2 files changed

+2
-0
lines changed

2 files changed

+2
-0
lines changed

Chefs/App.xaml.host.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@ private void ConfigureSerialization(HostBuilderContext context, IServiceCollecti
108108
{
109109
#if USE_MOCKS
110110
services
111+
.AddJsonTypeInfo(MockEndpointContext.Default.DictionaryStringSearchHistory)
111112
.AddJsonTypeInfo(MockEndpointContext.Default.ListCookbookData)
112113
.AddJsonTypeInfo(MockEndpointContext.Default.CookbookData)
113114
.AddJsonTypeInfo(MockEndpointContext.Default.RecipeData)

Chefs/Business/Services/Serialization/MockEndpointContext.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
namespace Chefs.Data;
55

6+
[JsonSerializable(typeof(Dictionary<string, SearchHistory>))]
67
[JsonSerializable(typeof(List<CookbookData>))]
78
[JsonSerializable(typeof(CookbookData))]
89
[JsonSerializable(typeof(RecipeData))]

0 commit comments

Comments
 (0)