我正在将一个库从.NET Framework移植到.NET Standard 2.0。初始库使用 BinaryFormatter 来序列化 MethodInformation 类型的对象。虽然这在.NET Framework中没有任何问题,但在.NET Standard中会抛出异常:
System.Runtime.Serialization.SerializationException:在程序集"System.Private.CoreLib, version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e"中键入"System.Reflection.RuntimeMethodInfo"未标记为可序列化。
为什么这在 .NET 标准/核心中不起作用?是否有任何解决方法可以做到这一点?我尝试使用 Newtonsoft 序列化为 JSON,但后来我无法反序列化它,而且序列化的对象最终占用了大量内存......
感谢任何建议!
正如例外所说,MethodInfo 不再可序列化,因此您无法序列化委托、Actions<>、Func<> ....使用默认的二进制序列化程序。
有关更多详细信息和原因,请参阅此问题:https://github.com/dotnet/corefx/issues/19119
也许这有助于作为一种解决方法,它在序列化后使用反射来绑定函数:
class Program
{
[Serializable]
public class Test
{
[JsonIgnore]
public Action<string> AFunc { get; set; }
public string[] AFuncIdentifier { get; set; }
}
public static class Methods
{
public static void Log(string additional)
{
Console.WriteLine(additional);
}
}
static void Main(string[] args)
{
var myTest = new Test();
myTest.AFunc = Methods.Log;
myTest.AFuncIdentifier = new string[] { myTest.AFunc.Method.DeclaringType.FullName,
myTest.AFunc.Method.Name };
var raw = JsonConvert.SerializeObject(myTest);
var test = JsonConvert.DeserializeObject<Test>(raw);
RestoreFunc(test);
test.AFunc("a");
}
private static void RestoreFunc(Test test)
{
var fIdentifier = test.AFuncIdentifier;
var t = Assembly.GetExecutingAssembly().GetType(fIdentifier[0]);
var m = t.GetMethod(fIdentifier[1]);
test.AFunc = (Action<string>)m.CreateDelegate(typeof(Action<string>));
}
}