Remarques sur la sérialisation de type Reliable Actors Service Fabric
Les arguments de toutes les méthodes, les types de résultats des tâches retournées par chaque méthode dans une interface d’acteur et les objets stockés dans le Gestionnaire d’état d’un acteur doivent être sérialisables en contrat de données. Cela s’applique également aux arguments des méthodes définies dans les interfaces d’événement d’acteur. (Les méthodes d’interface d’événement d’acteur retournent toujours la valeur nulle.)
Types de données personnalisés
Dans cet exemple, l’interface d’acteur suivante définit une méthode qui retourne un type de données personnalisé appelé VoicemailBox
:
public interface IVoiceMailBoxActor : IActor
{
Task<VoicemailBox> GetMailBoxAsync();
}
public interface VoiceMailBoxActor extends Actor
{
CompletableFuture<VoicemailBox> getMailBoxAsync();
}
L’interface est implémentée par un acteur qui utilise le gestionnaire d’état pour stocker un objet 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");
}
}
Dans cet exemple, l’objet VoicemailBox
est sérialisé quand :
- L’objet est transmis entre une instance d’acteur et un appelant.
- L’objet est enregistré dans le gestionnaire d’état quand il est enregistré sur disque et répliqué vers d’autres nœuds.
L’infrastructure Reliable Actor utilise la sérialisation DataContract. Par conséquent, les objets de données personnalisés et leurs membres doivent être annotés avec les attributs DataContract et DataMember, respectivement.
[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()
}