2017-04-23 14 views
1

私はAkka.NETを初めて使用しています。私は最近、私の大学のプロジェクトを始めて、奇妙な問題に直面しました。 2つの異なるデスクトップアプリケーションに2つのActorSystemがあります。最初のActorSystemでは、Akka.Remoteを使用して2つのアクター間でZippedAddressListMessageというメッセージを送信しています。Akka.NET:他のActorSystemにリストメッセージを送信できません

public class ZippedAddressListMessage 
    { 
     public ZippedAddressListMessage(List<string> list) 
     { 
      this.Values = list.AsReadOnly(); 
     } 

     public IReadOnlyCollection<string> Values { get; private set; } 

    } 

これは正常に動作しますが、私は他のActorSystemにこのメッセージを送信しようとすると、私はエラーの膨大なリストを取得する:私は一つだけで構成されて単純なメッセージを送信する場合、それにも関わらず screenshot #1 of the console window with the error

を整数、すべて正常に動作します。シリアライゼーションの問題がある可能性がありますが、どのように解決しなければならないのか分かりませんでした。 私はどこでも検索しましたが、答えはまだ見つかりませんでした。どうかこの問題を解決する方法を教えてください。最初ActorSystemから

俳優:他のActorSystemから

using Akka.Actor; 
    using System; 
    using System.Collections; 
    using System.Collections.Generic; 
    using System.Linq; 
    using System.Text; 
    using System.Threading.Tasks; 
    using ChatMessages; 
    using System.Diagnostics; 
    using Akka.Serialization; 
    using Akka.Actor.Internal; 
    using Akka.Remote; 

namespace Agent 
{ 
    public class ActorHelper: ReceiveActor 
    { 
     int N; 
     int fromId; 
     int count; 
     IActorRef chiefAgent; 
     List<recordItem> agentList; 
    public ActorHelper() 
    { 
     count = 0; 
     agentList = new List<recordItem>(); 

     Receive<CreateHelpersMessage>(msg => 
     { 
      chiefAgent = Sender; 
      fromId = msg.fromID; 
      N = msg.N; 

      for (int i = 0; i < msg.N; i++) 
      { 
       Process.Start("C:\\Users\\Artemij\\Source\\Repos\\Client\\AgentHelper\\AgentHelper\\bin\\Debug\\AgentHelper.exe", 
           "akka.tcp://[email protected]:8000/user/AgentActor/ActorHelper" + " " + i); 
      } 

     }); 


     Receive<NewAgentHelperMessage>(msg => 
     { 
      Console.WriteLine(msg.name + " " + Sender.Path.ToString() + " || " + (count+1) + "/" + N); 
      agentList.Add(new recordItem(fromId + count, msg.name, Sender)); 
      count++; 

      Context.Watch(Sender); 

      if (count == N) 
      { 
       chiefAgent.Tell(new AddressListMessage(agentList), Self); 

      } 


     }); 

     Receive<AddressListMessage>(msg => 
     { 
      Console.WriteLine("All is ready"); 
      List<string> temp = new List<string>(); 
      foreach (recordItem i in msg.Values) 
      { 
       temp.Add(i.ID + " " + i.name + " " + Serialization.SerializedActorPath(i.address)); 
      } 

      foreach (recordItem i in agentList) 
      { 
       Console.WriteLine(i.address); 

       //PROBLEM HERE! 
       i.address.Tell(new ZippedAddressListMessage(temp), Self); 

      } 



     }); 




    } 

} 

}

俳優:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using Akka.Actor; 
using ChatMessages; 
using System.Diagnostics; 

namespace AgentHelper 
{ 

class AgentHelperActor: ReceiveActor 
{ 
    int priority; 
    ActorSelection seniorAgentActor;  
    List<recordItem> fullList; 


    public AgentHelperActor(string addressSenior, string rank) 
    { 
     fullList = new List<recordItem>(); 

     seniorAgentActor = Context.ActorSelection(addressSenior); 
     Int32.TryParse(rank, out priority); 

     seniorAgentActor.Tell(new NewAgentHelperMessage("agent"+priority, ""), Self); 

     //RECEIVING A LIST!! 
     Receive<ZippedAddressListMessage>(msg => 
     { 
      Console.WriteLine("The entire list"); 


     }); 


     Receive<NewAgentHelperMessage>(msg => 
     { 
      Console.WriteLine(msg.name); 

     }); 


    } 


    public void updateList(IReadOnlyCollection<recordItem> list) 
    { 
     fullList = new List<recordItem>(list); 
     foreach (recordItem i in fullList) 
     { 
      Console.WriteLine(i.ToString()); 
     } 
    } 


} 

}

UPDATED: ここに、最初のエラーのスクリーンショットがあります。 screenshot #2 of the console window with the error これは、System.String []の形式がJSONのシリアル化と互換性がないと書いています。

答えて

0

問題が解決しました!問題はシリアライザに関するものでした:私はNewtonsoft.Jsonシリアライザを使用していました。リモートのActorSystemにメッセージを送信する場合、listを直列化することはできません。 Newtonsoftは、System.String []は互換性のない型であると説明しています。

解決策は、Hyperionシリアライザをインストールすることです。 http://getakka.net/docs/Serialization#how-to-setup-wire-as-default-serializer