- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我使用一个可序列化的简单类。它有一个用于反序列化的构造函数:
protected MyClass(SerializationInfo info, StreamingContext context)
和一个用于序列化的 GetObjectData 方法。它工作正常。
现在我添加了两个方法来监控反序列化:
[OnDeserializing()]
internal void OnDeserializingMethod(StreamingContext context)
{
System.Diagnostics.Trace.WriteLine("OnDeserializingMethod: " + this.GetType().ToString());
}
[OnDeserialized()]
internal void OnDeserializedMethod(StreamingContext context)
{
System.Diagnostics.Trace.WriteLine("OnDeserializedMethod: " + this.GetType().ToString());
}
并且想知道这些方法的调用顺序。现在这两个方法都在调用构造函数之前被调用。这怎么可能,为什么在调用(反序列化-)构造函数之后不调用“OnDeserialized”方法?在执行任何构造函数之前如何调用(非静态)方法? (我正在使用 BinaryFormatter)
最佳答案
Now both methods get called before the constructor gets called
不,顺序是:
And how can a (non-static) method be called before any constructor has been executed?
因为它欺骗和说谎;它不使用构造函数创建对象;不完全是。它使用 FormatterServices.GetUninitializedObject
分配 Vanilla 空白空间。然后,如果有自定义反序列化构造函数,它会在该对象的顶部调用构造函数。可恶的。像这样,基本上:
var obj = FormatterServices.GetUninitializedObject(typeof(MyClass));
var ctor = obj.GetType().GetConstructor(
BindingFlags.Instance | BindingFlags.Public| BindingFlags.NonPublic,
null,
new[] { typeof(SerializationInfo), typeof(StreamingContext) },
null);
ctor.Invoke(obj, new object[2]);
IMO 他们可能应该将此作为 ISerializable
接口(interface)上的第二个方法,但出于某种原因:他们没有这样做。真的很遗憾:这会让它更诚实,并且避免人们需要记住实现自定义构造函数。
示例输出:
.ctor: MyClass
> serializing
OnSerializingMethod: MyClass
GetObjectData: MyClass
OnSerializedMethod: MyClass
< serializing
> deserializing
OnDeserializingMethod: MyClass
.ctor: MyClass
OnDeserializedMethod: MyClass
< deserializing
示例代码:
using System;
using System.IO;
using System.Runtime.CompilerServices;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
[Serializable]
class MyClass : ISerializable
{
public MyClass() { Trace(); }
protected MyClass(SerializationInfo info, StreamingContext context) { Trace(); }
public void GetObjectData(SerializationInfo info, StreamingContext context) { Trace(); }
void Trace([CallerMemberName] string caller = null)
{
System.Console.WriteLine("{0}: {1}", caller, GetType().Name);
}
[OnDeserializing()]
internal void OnDeserializingMethod(StreamingContext context) { Trace(); }
[OnDeserialized()]
internal void OnDeserializedMethod(StreamingContext context) { Trace(); }
[OnSerializing()]
internal void OnSerializingMethod(StreamingContext context) { Trace(); }
[OnSerialized()]
internal void OnSerializedMethod(StreamingContext context) { Trace(); }
static void Main()
{
using (var ms = new MemoryStream())
{
var orig = new MyClass();
var ser = new BinaryFormatter();
System.Console.WriteLine("> serializing");
ser.Serialize(ms, orig);
System.Console.WriteLine("< serializing");
ms.Position = 0;
System.Console.WriteLine("> deserializing");
ser.Deserialize(ms);
System.Console.WriteLine("< deserializing");
}
}
}
关于c# - .NET 反序列化与 OnDeserializing 和 OnDeserialized,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18377046/
我使用一个可序列化的简单类。它有一个用于反序列化的构造函数: protected MyClass(SerializationInfo info, StreamingContext context) 和
我一直在阅读有关 .NET 中序列化的一些资料,并开始思考将 OnSerializing/OnSerialized/OnDeserializing/OnDeserialized 功能作为属性而不是接口
我有一个类维护对哈希表的引用并序列化/反序列化该哈希表。在调用 SerializationInfo.GetValue 之后,Hashtable 没有完全反序列化,因为反序列化发生在 IDeserial
[OnDeserialized] public static void OnDeserialized(this List self, StreamingContext context) { /
我的所有自定义实体集合都有一个基类,它的一个简单版本是这样的: [Serializable] public class CollectionBase : List where T : IEntity
除this post 中指出的以外我想在 XmlSerializer 开始反序列化之前采取行动(而不是在完成反序列化时) 背景:我有一个实现 INotifyPropertyChanged 的基类。此
我一直在尝试在类中的方法中实现 OnDeserialized 属性。在我使用 XmlSerializer 反序列化该类之后,该方法从未被调用。 即使序列化类是被序列化的主类的成员属性,也会调用 OnD
我正在尝试使用来自 this answer 的 JsonConverter给 Can I specify a path in an attribute to map a property in my
我有一个问题,我在三个小时的大部分时间里一直在努力解决这个问题。我几乎可以肯定我错过了一些非常明显的东西...... 我有一个简单的 XML 文件: 我有一个简
我曾尝试在我的 xml 中实现自动加密和解密,但它并不能正常工作,即数据未加密。可能是什么原因?我的代码如下所示。我正在使用 XmlSerializer 类。谢谢 [Serializable] pub
我们使用 JSON.NET 与 OnDeserialized 属性一起序列化数据,以便在反序列化后执行自定义代码: [OnDeserialized] internal void OnDeseriali
我们使用 JSON.NET 将我们的数据与 OnDeserialized 属性一起序列化以在反序列化后执行自定义代码: [OnDeserialized] internal void OnDeseria
所以我有一些这样的代码。 [DataContract] public class Example { SomeClass _someVar; [OnDeserializing]
是否有与 Java 中的 C# [OnSerialized] 和 [OnDeserialized] 属性等效的属性? 最佳答案 如果您使用默认的 Java 序列化,您可以覆盖用于序列化和反序列化的方法
我正在将现有的 .NET 类库改编为可移植类库。我正在使用配置文件 78(.NET 4.5、Windows Store 8、Windows Phone 8)而不是配置文件 158(它也针对 Silve
我是一名优秀的程序员,十分优秀!