【问题标题】: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;
            }
        }
    }
}

【问题讨论】:

    标签: c# serialization appdomain remoting datacontractjsonserializer


    【解决方案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 起作用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-01
        • 1970-01-01
        • 2010-11-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多