没有类源码的情况下,是否可以对对象进行.NET二进制序列化?我正在使用BinaryFormatter对C#中的某些对象进行二进制序列化。但是,某些对象包含我通过DLL访问但没有源代码的类,因此我无法使用Serializable属性标记它们。有没有一种简单的方法来序列化它们?我有一个变通方法,涉及采用类NoSource并创建一个新类SerializableNoSource,构造函数采用一个NoSource对象并且NoSource提取我需要的所有信息,但它很糟糕。有更好的选择吗?您可以创建序列化代理。假设我们在引用的程序集中定义了一个类,我们无法控制它,如下所示:publicclassPerson{publicstringName{get;放;}publicintAge{得到;放;}公共DriversLicense执照;}//这种类型的一个实例将成为对象图的一部分,并且也需要被//序列化。publicclassDriversLicense{publicstringNumber{get;放;}}中的每个类型都定义了一个序列化代理。要创建序列化代理,您只需要创建一个实际的ISerializationSurrogate接口的类型:publicclassPersonSurrogate:ISerializationSurrogate{//////手动将对象添加到存储中。///publicvoidGetObjectData(objectobj,SerializationInfoinfo,StreamingContextcontext){Personperson=(Person)obj;info.AddValue("姓名",person.Name);info.AddValue("年龄",person.Age);info.AddValue("许可证",person.License);}//////从存储中检索对象。//////publicobjectSetObjectData(objectobj,SerializationInfoinfo,StreamingContext上下文,ISurrogateSelector选择器){Personperson=(Person)obj;person.Name=info.GetString("姓名");person.Age=info.GetInt32("年龄");person.License=(DriversLicense)info.GetValue("License",typeof(DriversLicense));归还人;}}publicclassDriversLicenseSurrogate:ISerializationSurrogate{//////手动将对象添加到存储中。///publicvoidGetObjectData(objectobj,SerializationInfo信息,StreamingContextcontext){DriversLicense许可证=(DriversLicense)obj;info.AddValue("编号",license.Number);}//////从存储中检索对象。//////publicobjectSetObjectData(objectobj,SerializationInfoinfo,StreamingContext上下文,ISurrogateSelector选择器){DriversLicenselicense=(DriversLicense)obj;license.Number=info.GetString("号码");归还执照;然后你需要定义和初始化SurrogateSelector并赋值给你的IFormatter让你的IFormatter知道代理privatestaticvoidSerializePerson(Personperson){if(person==null)thrownewArgumentNullException("person");using(varmemoryStream=newMemoryStream()){//配置我们的代理选择器。varsurrogateSelector=newSurrogateSelector();surrogateSelector.AddSurrogate(typeof(Person),newStreamingContext(StreamingContextStates.All),newPersonSurrogate());surrogateSelector.AddSurrogate(typeof(DriversLicense),newStreamingContext(StreamingContextStates.All),newDriversLicenseSurrogate());//序列化对象IFormatterformatter=newBinaryFormatter();formatter.SurrogateSelector=surrogateSelector;formatter.Serialize(memoryStream,person);//回到流的开头memoryStream.Seek(0,SeekOrigin.Begin);//反序列化对象PersondeserializedPerson=(Person)formatter.Deserialize(memoryStream);使用序列化代理绝不是直截了当的,实际上会变得非常冗长。但是,由于您已经手动序列化了所需的值,所以我认为这不是问题。使用代理是一种更统一的处理这种情况的方法,应该会让您感觉更舒服。您可以使用Mono.Cecil将[SerializableAttribute]添加到类中,但如果有另一种方法可以达到预期的结果,我不会这样做。我同意@Servy,如果类的作者不希望它被序列化,你不应该尝试直接序列化它。所以从架构的角度来看,你做的是对的。为了使您当前的方法不那么“hacky”,请考虑为包含对不可序列化对象的引用的类实现ISerializable。创建一个新类,它继承未标记为可序列化属性的现有类并实现ISerializable接口。如果该类是密封的,那么您可以使用Json.NET,然后将其转换为二进制文件,反之亦然(很长时间,如果没有别的帮助使用它的话:))。我认为更简洁的方法是实现ISerializable接口并自行管理序列化和逆向过程。在MSDN中,我们可以找到:Serializationcannotbeaddedtoaclassaftercompilation....以上是C#学习教程:Isitpossibletoperform.NETbinaryserializationonanobjectwhenyoudon'thavethesourcecodeof班上?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
