从另一个应用程序域返回的对象可以在调用域中序列化吗?
Posted
技术标签:
【中文标题】从另一个应用程序域返回的对象可以在调用域中序列化吗?【英文标题】:Can an object returned from another application domain be serialized in calling domain? 【发布时间】:2016-10-22 02:21:19 【问题描述】:在以下代码中,当调用SerializeToJson()
方法时,我在WriteObject()
收到以下异常:
远程处理在类型“System.MarshalByRefObject”上找不到字段“__identity”
我正在尝试做的事情可能吗?我对应用程序域及其相关的东西(透明代理等)有点陌生。我可以在当前应用程序域中成功序列化我的 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;
【问题讨论】:
【参考方案1】:对于 .NET Remoting,没有必要将 [DataContract]
与 MarshalByRefObject
混合使用。只需像使用 RemoteClass
一样使用 MarshalByRefObject
【讨论】:
【参考方案2】:Protobuf 可以做到这一点:
https://github.com/mgravell/protobuf-net
但是,我会警告说,基于 [DataContract] 的使用,这闻起来像 WCF,通常是单向路。 WCF 因指示您应该如何编写应用程序而臭名昭著 - 这包括序列化。
话虽如此,我从来没有遇到过 JSON.Net 用于序列化标有 [DataContract] 的类的问题。 JsonConvert.Serialize() 对 System.Object 起作用。
【讨论】:
以上是关于从另一个应用程序域返回的对象可以在调用域中序列化吗?的主要内容,如果未能解决你的问题,请参考以下文章
如何配置 Angular $resource (ngResource) 以使用 CORS 从另一个域中提取数据