1

在下面的代码,当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; 
      } 
     } 
    } 
} 

回答

0

这是可能与的Protobuf

https://github.com/mgravell/protobuf-net

然而,我会基于的[DataContract]使用警告说,这种气味像WCF,通常是一道路。 WCF臭名昭着地指导你如何编写你的应用程序 - 这包括序列化。这就是说,我从来没有用JSON.Net序列化标有[DataContract]的类的问题。 JsonConvert.Serialize()对System.Object起作用。

0

没有必要混合[DataContract]MarshalByRefObject对于.NET 远程处理。只需使用MarshalByRefObject就像您使用RemoteClass

相关问题