我正在尝试使用以下方法创建对象的深层克隆.
public static T DeepClone<T>(this T target)
{
using (MemoryStream stream = new MemoryStream())
{
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(stream, target);
stream.Position = 0;
return (T)formatter.Deserialize(stream);
}
}
Run Code Online (Sandbox Code Playgroud)
此方法需要一个Serialized对象,即一个具有"Serializable"属性的类的对象.我有一个类,它具有属性"DataContract",但该方法不使用此属性.我认为"DataContract"也是一种序列化器,但可能与"Serializable"不同.
有谁能请给我两者之间的区别?另请告诉我是否可以创建一个只有1个属性的对象的深度克隆,它可以完成"DataContract"和"Serializable"属性的工作,也可能是创建深度克隆的不同方式?
请帮忙!
我将我的类的一个实例序列化为一个文件(带有BinaryFormatter)
之后,在另一个项目中,我想反序列化这个文件,但没有成功,因为我的新项目没有我旧类的描述。在.Deserialize()收到一个异常
Unable to find assembly '*MyAssembly, Version=1.9.0.0, Culture=neutral, PublicKeyToken=null'.*".
Run Code Online (Sandbox Code Playgroud)
但是我有包含我想要反序列化的旧类的描述的程序集的 .DLL。
我不想在项目中添加对 this DLL 的引用(我希望能够反序列化任何类型程序集的类......)
如何通知序列化器/反序列化器使用我动态加载的程序集?
设置DisallowApplicationBaseProbing = true时,我需要在创建的AppDomain上连接AssemblyResolve事件。我这样做的原因是强制运行时调用需要解析程序集的AssemblyResolve事件,而不是先进行探测。这样,另一个开发人员就不能仅将MyDllName.dll粘贴在ApplicationBase目录中,并覆盖我想在AssemblyResolve事件中加载的程序集。
这样做的问题如下:
class Program
{
static void Main()
{
AppDomainSetup ads = new AppDomainSetup();
ads.DisallowApplicationBaseProbing = true;
AppDomain appDomain = AppDomain.CreateDomain("SomeDomain", null, ads);
appDomain.AssemblyResolve += OnAssemblyResolve;
appDomain.DoCallBack(target);
}
static System.Reflection.Assembly OnAssemblyResolve(object sender, ResolveEventArgs args)
{
Console.WriteLine("Hello");
return null;
}
private static void target()
{
Console.WriteLine(AppDomain.CurrentDomain);
}
}
Run Code Online (Sandbox Code Playgroud)
代码永远不会超出+ = OnAssemblyResolve行。
当代码尝试执行时,新的应用程序域将尝试解析我正在其中执行的程序集。由于DisallowApplicationBaseProbing = true,因此不知道在哪里可以找到该程序集。看来我有鸡肉和鸡蛋问题。它需要解析我的程序集以连接程序集解析器,但需要程序集解析器来解析我的程序集。
感谢您提供的所有帮助。
-麦克风