我试图制作一个blazor WebAssembly网站(托管在Github Pages上),调用基于云的API (AWS)。它接收包含SortedSet值的json序列化并对其进行反序列化。
我试图隔离这个问题,并最终得到了可以复制的最小代码,即当您试图立即反序列化SortedSet时。
@page "/"
<button onclick="@Deserialize">Deserialize</button>
<br />Message: @message
@code
{
private string message = "Nothing happened yet";
private void Deserialize()
{
try
{
SortedSet<int> sortedSet = JsonSerializer.Deserialize<SortedSet<int>>("[1,2,3]");
message = $"Deserialized SortedSet: {string.Join(",", sortedSet)}";
}
catch (Exception e)
{
message = $"Deserialization ended up in an exception: {e}";
}
}
}
这里有一个错误:
System.NotSupportedException: DeserializeNoConstructor, JsonConstructorAttribute,
System.Collections.Generic.SortedSet`1[System.Int32]
Path: $ | LineNumber: 0 | BytePositionInLine: 1.
---> System.NotSupportedException: DeserializeNoConstructor,
JsonConstructorAttribute,
System.Collections.Generic.SortedSet`1[System.Int32]
Exception_EndOfInnerExceptionStack
at System.Text.Json.ThrowHelper.ThrowNotSupportedException(ReadStack& , Utf8JsonReader& , NotSupportedException )
at System.Text.Json.ThrowHelper.ThrowNotSupportedException_DeserializeNoConstructor(Type , Utf8JsonReader& , ReadStack& )
at System.Text.Json.Serialization.Converters.ISetOfTConverter`2[[System.Collections.Generic.SortedSet`1[[System.Int32, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]], System.Collections, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a],[System.Int32, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]].CreateCollection(Utf8JsonReader& , ReadStack& , JsonSerializerOptions )
at System.Text.Json.Serialization.JsonCollectionConverter`2[[System.Collections.Generic.SortedSet`1[[System.Int32, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]], System.Collections, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a],[System.Int32, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]].OnTryRead(Utf8JsonReader& , Type , JsonSerializerOptions , ReadStack& , SortedSet`1& )
at System.Text.Json.Serialization.JsonConverter`1[[System.Collections.Generic.SortedSet`1[[System.Int32, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]], System.Collections, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a]].TryRead(Utf8JsonReader& , Type , JsonSerializerOptions , ReadStack& , SortedSet`1& )
at System.Text.Json.Serialization.JsonConverter`1[[System.Collections.Generic.SortedSet`1[[System.Int32, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]], System.Collections, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a]].ReadCore(Utf8JsonReader& , JsonSerializerOptions , ReadStack& )
at System.Text.Json.JsonSerializer.ReadFromSpan[SortedSet`1](ReadOnlySpan`1 , JsonTypeInfo , Nullable`1 )
at System.Text.Json.JsonSerializer.ReadFromSpan[SortedSet`1](ReadOnlySpan`1 , JsonTypeInfo )
at System.Text.Json.JsonSerializer.Deserialize[SortedSet`1](String , JsonSerializerOptions )
at SortedSetDeserializationDemo.Pages.Index.Deserialize()
它只出现在GitHub页面上,当我从Visual Studio运行时无法复制它。
我已经找到了如何修复它。在反序列化任何SortedSet之前,您应该序列化任何(可能是非空的)SortedSet。
这里有一些奇怪的细节:
- 如果我在之后添加序列化权,仍然会出现错误反序列化尝试 没有错误,如果我做序列化在另一个方法,绑定到一个按钮。即使我不使用那个按钮。
- 反序列化List时没有错误
其他一些可能相关的细节:它不依赖于发布/调试配置。我没有测试所有可能的情况,但我测试的结果都是一样的。这似乎与JIT有关。它可以在Chrome和Edge中复制。使用。net 6.0(尝试了6.0.10和6.0.11)
以下是我的问题:
- 它可能是什么?
- 如果它是一个错误,它是一个。net/blazor错误,GitHub页面错误或浏览器错误?
正如@HenkHolterman在评论中提到的,在发布过程中发生了一些事情。我试图在反序列化之前比较有序列化和没有序列化的发布输出,并且似乎有不同的System.Collections.dll。不使用s11n时为8.5KB,使用s11n时为13KB。如果我只将System.Collections.dll替换为13KB版本,并在blazor.boot中调整其散列。Json,一切正常工作。我要为。net创建一个关于它的bug报告。
乌利希期刊指南:似乎添加一个SortedSet构造函数就足够了。
它解释了我观察到的奇怪行为。它可以在序列化之前使用反序列化,因为我必须创建一个SortedSet来序列化,并且我调用了一个SortedSet构造函数。当我在反序列化之后调用Serialize(SortedSet)时,我使用了从反序列化中获得的值,因此没有从编译后的代码直接调用SortedSet构造函数。
在我的例子中,以反射模式进行序列化,因此发布代码不知道在我的应用程序中使用了SortedSet构造函数。这样,发布就修饰了SortedSet无参数构造函数。
另一个解决方法是使用源生成显然,他们不会对它做任何改变,详见https://github.com/dotnet/runtime/issues/78776