Partilhar via


Notas sobre a serialização do tipo Atores Confiáveis do Service Fabric

Os argumentos de todos os métodos, os tipos de resultados das tarefas retornadas por cada método em uma interface de ator e os objetos armazenados no gerenciador de estado de um ator devem ser serializáveis por contrato de dados. Isso também se aplica aos argumentos dos métodos definidos nas interfaces de evento do ator. (Os métodos de interface de eventos do ator sempre retornam void.)

Tipos de dados personalizados

Neste exemplo, a interface do ator a seguir define um método que retorna um tipo de dados personalizado chamado VoicemailBox:

public interface IVoiceMailBoxActor : IActor
{
    Task<VoicemailBox> GetMailBoxAsync();
}
public interface VoiceMailBoxActor extends Actor
{
    CompletableFuture<VoicemailBox> getMailBoxAsync();
}

A interface é implementada por um ator que usa o gerenciador de estado para armazenar um VoicemailBox objeto:

[StatePersistence(StatePersistence.Persisted)]
public class VoiceMailBoxActor : Actor, IVoicemailBoxActor
{
    public VoiceMailBoxActor(ActorService actorService, ActorId actorId)
        : base(actorService, actorId)
    {
    }

    public Task<VoicemailBox> GetMailboxAsync()
    {
        return this.StateManager.GetStateAsync<VoicemailBox>("Mailbox");
    }
}

@StatePersistenceAttribute(statePersistence = StatePersistence.Persisted)
public class VoiceMailBoxActorImpl extends FabricActor implements VoicemailBoxActor
{
    public VoiceMailBoxActorImpl(ActorService actorService, ActorId actorId)
    {
         super(actorService, actorId);
    }

    public CompletableFuture<VoicemailBox> getMailBoxAsync()
    {
         return this.stateManager().getStateAsync("Mailbox");
    }
}

Neste exemplo, o VoicemailBox objeto é serializado quando:

  • O objeto é transmitido entre uma instância de ator e um chamador.
  • O objeto é salvo no gerenciador de estado onde é persistido no disco e replicado para outros nós.

A estrutura Reliable Ator usa a serialização DataContract. Portanto, os objetos de dados personalizados e seus membros devem ser anotados com os atributos DataContract e DataMember , respectivamente.

[DataContract]
public class Voicemail
{
    [DataMember]
    public Guid Id { get; set; }

    [DataMember]
    public string Message { get; set; }

    [DataMember]
    public DateTime ReceivedAt { get; set; }
}
public class Voicemail implements Serializable
{
    private static final long serialVersionUID = 42L;

    private UUID id;                    //getUUID() and setUUID()

    private String message;             //getMessage() and setMessage()

    private GregorianCalendar receivedAt; //getReceivedAt() and setReceivedAt()
}
[DataContract]
public class VoicemailBox
{
    public VoicemailBox()
    {
        this.MessageList = new List<Voicemail>();
    }

    [DataMember]
    public List<Voicemail> MessageList { get; set; }

    [DataMember]
    public string Greeting { get; set; }
}
public class VoicemailBox implements Serializable
{
    static final long serialVersionUID = 42L;
    
    public VoicemailBox()
    {
        this.messageList = new ArrayList<Voicemail>();
    }

    private List<Voicemail> messageList;   //getMessageList() and setMessageList()

    private String greeting;               //getGreeting() and setGreeting()
}

Próximos passos