从另一个应用程序域返回的对象是否可以在调用域中序列化?
问题描述:
在下面的代码,当SerializeToJson()
方法被调用时,我收到WriteObject()
以下异常:从另一个应用程序域返回的对象是否可以在调用域中序列化?
远程处理上找不到类型字段'__identity“System.MarshalByRefObject”
是什么我试图做可能吗?我有点不熟悉应用程序域及其相关事物(透明代理等)。我可以在当前的应用程序域中成功序列化我的TestClass,但我不明白为什么它不在这里工作。感谢您的期待。
using System;
using System.IO;
using System.Reflection;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;
namespace ConsoleApplication6
{
public class BaseClass : MarshalByRefObject { }
public class RemoteClass : BaseClass
{
public TestClass DoIt()
{
return new TestClass { Prop1 = DateTime.Now, Prop2 = 1234 };
}
}
[DataContract]
public class TestClass : MarshalByRefObject
{
public TestClass() { }
public TestClass(TestClass tc)
{
Prop1 = tc.Prop1;
Prop2 = tc.Prop2;
}
[DataMember]
public DateTime Prop1 { get; set; }
[DataMember]
public int Prop2 { get; set; }
}
class Program
{
static void Main(string[] args)
{
var appDomain = AppDomain.CreateDomain("myappdomain");
var remoteClass = (RemoteClass)appDomain.CreateInstanceAndUnwrap(Assembly.GetExecutingAssembly().FullName, typeof(RemoteClass).FullName);
var returnedTestClass = remoteClass.DoIt();
Console.WriteLine(SerializeToJson(returnedTestClass));
}
private static string SerializeToJson(object obj)
{
try
{
using (var stream = new MemoryStream())
{
var serializer = new DataContractJsonSerializer(obj.GetType());
serializer.WriteObject(stream, obj);
stream.Position = 0;
using (var streamReader = new StreamReader(stream))
{
return streamReader.ReadToEnd();
}
}
}
catch (Exception e)
{
// Error: Remoting cannot find field '__identity' on type 'System.MarshalByRefObject'.
Console.WriteLine(e.Message);
return string.Empty;
}
}
}
}
答
这是可能与的Protobuf:
https://github.com/mgravell/protobuf-net
然而,我会基于的[DataContract]使用警告说,这种气味像WCF,通常是一道路。 WCF臭名昭着地指导你如何编写你的应用程序 - 这包括序列化。这就是说,我从来没有用JSON.Net序列化标有[DataContract]的类的问题。 JsonConvert.Serialize()对System.Object起作用。
答
没有必要混合[DataContract]
和MarshalByRefObject
对于.NET 远程处理。只需使用MarshalByRefObject
就像您使用RemoteClass