1

В следующем коде, когда метод SerializeToJson() называется, я получаю следующее исключение на WriteObject():Может ли объект, возвращенный из другого домена приложения, быть сериализован в домене вызова?

Remoting не может найти поле «__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. Remoting. Просто используйте MarshalByRefObject, как вы делали с RemoteClass

Смежные вопросы