1

SerializeToJson()メソッドが呼び出され、次のコードでは、私はWriteObject()に次の例外を受け取りに:別のアプリケーションドメインから返されたオブジェクトを呼び出し元ドメインでシリアル化できますか?

リモーティングはタイプのフィールド「__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で可能とすることができる:私は[のDataContract]の使用に基づくことを警告することになる、

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

しかし、これは通常一つであるWCF、のようなにおい - 通り道。 WCFはアプリケーションの記述方法を知らせるために有名ですが、これにはシリアル化も含まれます。

つまり、私は[DataContract]でマークされたクラスをシリアル化するためにJSON.Netに問題が発生したことはありません。 JsonConvert.Serialize()はSystem.Objectに対して機能します。

0

[DataContract]MarshalByRefObjectとしてください。Remotingです。あなたと同じようにMarshalByRefObjectを使用してください。RemoteClass

関連する問題