Open
Description
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