1

, 나는 WriteObject()에 다음과 같은 예외가 나타납니다다른 응용 프로그램 도메인에서 반환 된 객체를 호출 도메인에서 직렬화 할 수 있습니까? <code>SerializeToJson()</code> 메소드가 호출 될 때 다음 코드에서는

원격 유형에 필드 '__identity'를 찾을 수 없습니다 'System.MarshalByRefObject'가

은 무엇인가 나는 가능한 것을 시도하고 있는가? 나는 Application Domains와 그와 관련된 것들 (투명한 프록시 등)에 대해 조금 익숙하지 않다. 현재 응용 프로그램 도메인에서 내 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으로 할 수있다 : I가 [DataContract]의 사용량에 따라 그 경고 것이다

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

그러나, 이것은 일반적으로 하나 WCF, 냄새 - 도로. WCF는 응용 프로그램을 작성하는 방법을 알려주는 것으로 유명합니다. 여기에는 직렬화가 포함됩니다.

즉, 저는 [DataContract]로 표시된 클래스를 직렬화하기 위해 JSON.Net에 문제가 없었습니다. JsonConvert.Serialize()는 System.Object에 대해 작동합니다.

0

[DataContract]MarshalByRefObject은 .NET 용 Remoting과 섞어서는 안됩니다. 그랬던 것처럼 MarshalByRefObject을 사용하십시오. RemoteClass

관련 문제