Open
Description
openedon Feb 22, 2024
Description
we are using Spanjson
on ios use interp mode, it will throw exception when use expression
generate deserialize/serialize code
Reproduction Steps
our source code:
internal class SpanJson
{
/// <summary>
/// 一个简单的SpanJson测试用例
/// </summary>
[Test("SpanJson.SimpleSample")]
public static void Run()
{
Person person = new Person { Name = "John Doe", Age = 30 };
//Utf16
{
//Generic
{
var json = JsonSerializer.Generic.Utf16.Serialize(person);
var deserializeData = JsonSerializer.Generic.Utf16.Deserialize<Person>(json);
TestUtility.Check(deserializeData.Name == person.Name && deserializeData.Age == person.Age);
}
//NonGeneric
{
var json = JsonSerializer.NonGeneric.Utf16.Serialize(person);
var deserializeData = JsonSerializer.NonGeneric.Utf16.Deserialize(json, typeof(Person)) as Person;
TestUtility.Check(deserializeData.Name == person.Name && deserializeData.Age == person.Age);
}
}
//Utf8
{
//Generic
{
var bytes = JsonSerializer.Generic.Utf8.Serialize(person);
var deserializeData = JsonSerializer.Generic.Utf8.Deserialize<Person>(bytes);
TestUtility.Check(deserializeData.Name == person.Name && deserializeData.Age == person.Age);
}
//NonGeneric
{
var bytes = JsonSerializer.NonGeneric.Utf8.Serialize(person);
var deserializeData = JsonSerializer.NonGeneric.Utf8.Deserialize(bytes, typeof(Person)) as Person;
TestUtility.Check(deserializeData.Name == person.Name && deserializeData.Age == person.Age);
}
}
}
}
[JsonFormatterGenerator]
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
Expected behavior
walk correctly
Actual behavior
throw exception, the stacktrace show below:
···
Exception Test Name: SpanJson.SimpleSample
Cannot box IsByRefLike type 'System.ReadOnlySpan`1'
at System.Delegate.CreateDelegate(Type type, Object firstArgument, MethodInfo method, Boolean throwOnBindFailure, Boolean allowClosed) in System.Private.CoreLib.dll:token 0x6000258+0x86
at System.Delegate.CreateDelegate(Type type, Object firstArgument, MethodInfo method, Boolean throwOnBindFailure) in System.Private.CoreLib.dll:token 0x6000256+0x0
at System.Delegate.CreateDelegate(Type type, Object firstArgument, MethodInfo method) in System.Private.CoreLib.dll:token 0x600026d+0x0
at System.Reflection.Emit.DynamicMethod.CreateDelegate(Type delegateType, Object target) in System.Private.CoreLib.dll:token 0x6005d6b+0x11
at System.Dynamic.Utils.DelegateHelpers.CreateObjectArrayDelegateRefEmit(Type delegateType, Func`2 handler) in System.Linq.Expressions.dll:token 0x6001038+0x355
at System.Dynamic.Utils.DelegateHelpers.CreateObjectArrayDelegate(Type delegateType, Func`2 handler) in System.Linq.Expressions.dll:token 0x600102d+0x2
at System.Linq.Expressions.Interpreter.LightLambda.MakeDelegate(Type delegateType) in System.Linq.Expressions.dll:token 0x6000c1c+0x31
at System.Linq.Expressions.Interpreter.LightDelegateCreator.CreateDelegate(IStrongBox[] closure) in System.Linq.Expressions.dll:token 0x6000c19+0x0
at System.Linq.Expressions.Interpreter.LightDelegateCreator.CreateDelegate() in System.Linq.Expressions.dll:token 0x6000c18+0x0
at System.Linq.Expressions.Expression`1[[SpanJson.JsonSerializer.NonGeneric.Inner`2.DeserializeDelegate[[System.Char, System.Private.CoreLib, Version=7.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[SpanJson.Resolvers.ExcludeNullsOriginalCaseResolver`1[[System.Char, System.Private.CoreLib, Version=7.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]], SpanJson, Version=4.0.1.0, Culture=neutral, PublicKeyToken=12740fa6726bc6d3]], SpanJson, Version=4.0.1.0, Culture=neutral, PublicKeyToken=12740fa6726bc6d3]].Compile() in System.Linq.Expressions.dll:token 0x6000641+0x3
at SpanJson.JsonSerializer.NonGeneric.Inner`2[[System.Char, System.Private.CoreLib, Version=7.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[SpanJson.Resolvers.ExcludeNullsOriginalCaseResolver`1[[System.Char, System.Private.CoreLib, Version=7.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]], SpanJson, Version=4.0.1.0, Culture=neutral, PublicKeyToken=12740fa6726bc6d3]].BuildDeserializer(Type type) in G:\MonoGroup\spanjson\SpanJson\JsonSerializer.NonGeneric.cs:line 233
at SpanJson.JsonSerializer.NonGeneric.Inner`2[[System.Char, System.Private.CoreLib, Version=7.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[SpanJson.Resolvers.ExcludeNullsOriginalCaseResolver`1[[System.Char, System.Private.CoreLib, Version=7.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]], SpanJson, Version=4.0.1.0, Culture=neutral, PublicKeyToken=12740fa6726bc6d3]].BuildInvoker(Type type) in G:\MonoGroup\spanjson\SpanJson\JsonSerializer.NonGeneric.cs:line 160
at SpanJson.JsonSerializer.NonGeneric.Inner`2.<>c[[System.Char, System.Private.CoreLib, Version=7.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[SpanJson.Resolvers.ExcludeNullsOriginalCaseResolver`1[[System.Char, System.Private.CoreLib, Version=7.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]], SpanJson, Version=4.0.1.0, Culture=neutral, PublicKeyToken=12740fa6726bc6d3]].<InnerSerializeToString>b__2_0(Type x) in G:\MonoGroup\spanjson\SpanJson\JsonSerializer.NonGeneric.cs:line 44
at System.Collections.Concurrent.ConcurrentDictionary`2[[System.Type, System.Private.CoreLib, Version=7.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[SpanJson.JsonSerializer.NonGeneric.Inner`2.Invoker[[System.Char, System.Private.CoreLib, Version=7.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[SpanJson.Resolvers.ExcludeNullsOriginalCaseResolver`1[[System.Char, System.Private.CoreLib, Version=7.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]], SpanJson, Version=4.0.1.0, Culture=neutral, PublicKeyToken=12740fa6726bc6d3]], SpanJson, Version=4.0.1.0, Culture=neutral, PublicKeyToken=12740fa6726bc6d3]].GetOrAdd(Type key, Func`2 valueFactory) in System.Collections.Concurrent.dll:token 0x60000d1+0x47
at SpanJson.JsonSerializer.NonGeneric.Inner`2[[System.Char, System.Private.CoreLib, Version=7.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[SpanJson.Resolvers.ExcludeNullsOriginalCaseResolver`1[[System.Char, System.Private.CoreLib, Version=7.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]], SpanJson, Version=4.0.1.0, Culture=neutral, PublicKeyToken=12740fa6726bc6d3]].InnerSerializeToString(Object input) in G:\MonoGroup\spanjson\SpanJson\JsonSerializer.NonGeneric.cs:line 44
at SpanJson.JsonSerializer.NonGeneric.Utf16.Serialize[ExcludeNullsOriginalCaseResolver`1](Object input) in G:\MonoGroup\spanjson\SpanJson\JsonSerializer.NonGeneric.cs:line 416
at SpanJson.JsonSerializer.NonGeneric.Utf16.Serialize(Object input) in G:\MonoGroup\spanjson\SpanJson\JsonSerializer.NonGeneric.cs:line 346
at UnrealEngine.Game.Tests.SpanJson.SpanJson.Run() in /Users/game-netease/unrealmono/UEDemo-427/UEDemo/Content/Script/Game/Tests/SpanJson/SpanJson.cs:line 27
···
Regression?
we have only try use on .net7, but I think .net8 also have this problem.
Known Workarounds
no
Configuration
ios
Other information
No response
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment