Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#构造ISerializable接口的正确方法?_C#_Serialization_Formatter - Fatal编程技术网

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)