C#构造ISerializable接口的正确方法?
我最近制作了自己的自定义格式化程序,它接受一个运行时对象并以字符串格式写下它的对象图,然后接受该字符串并将其转换回运行时对象。 示例:C#构造ISerializable接口的正确方法?,c#,serialization,formatter,C#,Serialization,Formatter,我最近制作了自己的自定义格式化程序,它接受一个运行时对象并以字符串格式写下它的对象图,然后接受该字符串并将其转换回运行时对象。 示例:[CustomFormatter.Btype,CustomFormatter,版本=1.0.0.0,区域性=中性,PublicKeyToken=null=[a==5][b==0] 在与基本对象混在一起之后(int,bool,float…)我尝试使用ISerializable接口将Bitmap对象序列化为字符串,效果很好,但当我尝试重新构建对象时,发现一个错误Sys
[CustomFormatter.Btype,CustomFormatter,版本=1.0.0.0,区域性=中性,PublicKeyToken=null=[a==5][b==0]
在与基本对象混在一起之后(int
,bool
,float
…)我尝试使用ISerializable
接口将Bitmap
对象序列化为字符串,效果很好,但当我尝试重新构建对象时,发现一个错误System.MissingMethodException:找不到“System.Drawing.Bitmap”类型的构造函数。
如果位图没有将SerializationInfo和StreamingContext作为参数的构造函数,那么如何构造继承了ISerializable
接口的对象
这一部分是主要问题,但我可以包括整个代码:
private static object SeriObjConstructor(Type objType, ref string dataInfo, ref int location)
{
SerializationInfo info = new SerializationInfo(objType, new FormatterConverter());
StreamingContext context = new StreamingContext(StreamingContextStates.All);
location += serializerEntry.Length;
while (!CheckHitOperator(dataInfo, serializerExit, ref location))
{
KeyValuePair<string, Type> serializedObj = GetSerialiedName(ref dataInfo, ref location); //<name, type>
info.AddValue(serializedObj.Key, Construction(serializedObj.Value, ref dataInfo, ref location));
}
location += serializerExit.Length;
location += endClass.Length;
var instance = Activator.CreateInstance(objType, info, context); //THROWS AN ERROR
return instance;
}
private static object SeriObjConstructor(类型objType,ref string dataInfo,ref int location)
{
SerializationInfo=new SerializationInfo(objType,new FormatterConverter());
StreamingContext=newstreamingcontext(StreamingContextStates.All);
location+=serializerEntry.Length;
while(!CheckHitOperator(数据信息、序列化、引用位置))
{
KeyValuePair serializedObj=GetSerialiedName(参考数据信息,参考位置)//
info.AddValue(serializedBj.Key,构造(serializedBj.Value,ref dataInfo,ref location));
}
location+=it.Length;
位置+=endClass.Length;
var instance=Activator.CreateInstance(对象类型、信息、上下文);//引发错误
返回实例;
}
如果由于旧版.NET Framework的原因而被迫这样做,并且您正在接管序列化程序引擎的角色:您可以使用FormatterServices.GetUninitializedObject
构造原始对象。此API明确用于序列化等功能,但应视为高级/外来功能,需要特别小心。在某些情况下可能会发生不好的事情(字段未初始化等)
老实说,在2020年使用
ISerializable
接口没有正确的方法-整个API都已弃用和过时,并且在.NET Core/.NET 5中没有得到广泛支持,我不建议使用它开始新的工作。有关问题/原因的更多详细信息如下:,以及许多其他未弃用的序列化框架。我听说BinaryFormatter不安全,这就是为什么我制作了自己的格式化程序用于教育和了解安全问题。对于基本对象,我使用的是FormatterServices.GetUninitializedObject
,但对于其他.Net对象,如Bitmap
,此类方法无效。我想知道有没有一种不同的方法来初始化从ISerializable
继承的对象。如果BinaryFormatter
能够序列化如此复杂的对象,我假设有一种特殊的方法来构造它们,但我找不到。你知道任何开源格式化程序,所以我可以了解他们是如何处理的?@Yoav通常是检查某些构造函数(采用某些类型的构造函数)的组合,无参数,返回到formatterservices-但是,老实说,序列化像Bitmap这样的类型(这是一个实现细节)是错误的,而不是序列化数据(例如blob)