Notas sobre la serialización del tipo de Reliable Actors de Service Fabric
Los argumentos de todos los métodos, los tipos de resultados de las tareas que devuelve cada método de una interfaz de actor y los objetos almacenados en el administrador de estados de un actor deben ser serializables de contratos de datos. Esto también se aplica a los argumentos de los métodos definidos en interfaces de eventos de actor. (Los métodos de interfaz de eventos de actor siempre devuelven void).
Tipos de datos personalizados
En este ejemplo, la siguiente interfaz de actor define un método que devuelve un tipo de datos personalizado denominado VoicemailBox
:
public interface IVoiceMailBoxActor : IActor
{
Task<VoicemailBox> GetMailBoxAsync();
}
public interface VoiceMailBoxActor extends Actor
{
CompletableFuture<VoicemailBox> getMailBoxAsync();
}
La interfaz se implementa mediante un actor que utiliza el administrador de estado para almacenar un objeto VoicemailBox
:
[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");
}
}
En este ejemplo, el objeto VoicemailBox
se serializa en los siguientes casos:
- El objeto se transmite entre una instancia de actor y un llamador.
- El objeto se guarda en el administrador de estados, donde se almacena en un disco y se replica en otros nodos.
El marco de Reliable Actors usa la serialización DataContract. Por lo tanto, los objetos de datos personalizados y sus miembros se deben anotar con los atributos DataContract y 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()
}