Hinweise zur Typserialisierung von Service Fabric Reliable Actors
Die Argumente aller Methoden, die Ergebnistypen der von jeder Methode zurückgegebenen Aufgaben in einer Actor-Schnittstelle sowie Objekte, die im Zustands-Manager des Akteurs gespeichert sind, müssen mit DataContract serialisiert werden können. Dies gilt auch für die Argumente der Methoden, die in Actor-Ereignisschnittstellendefiniert werden. (In Actor-Ereignisschnittstellen definierte Methoden geben immer „void“ zurück).
Benutzerdefinierte Datentypen
In diesem Beispiel definiert die folgende Actor-Schnittstelle eine Methode, die einen benutzerdefinierten Datentyp namens VoicemailBox
zurückgibt.
public interface IVoiceMailBoxActor : IActor
{
Task<VoicemailBox> GetMailBoxAsync();
}
public interface VoiceMailBoxActor extends Actor
{
CompletableFuture<VoicemailBox> getMailBoxAsync();
}
Die Schnittstelle wird durch einen Akteur implementiert, der den Zustands-Manager zum Speichern eines VoicemailBox
-Objekts verwendet:
[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");
}
}
In diesem Beispiel wird das VoicemailBox
-Objekt serialisiert, wenn:
- Das Objekt zwischen einer Actor-Instanz und einem Anrufer übertragen wird.
- Das Objekt im Zustands-Manager gespeichert wird, von wo aus es dauerhaft auf einem Datenträger gespeichert und auf die anderen Knoten repliziert wird.
Das Reliable Actor-Framework verwendet DataContract-Serialisierung. Aus diesem Grund müssen die benutzerdefinierten Objekte und deren Member mit den Anmerkungen DataContract beziehungsweise DataMember versehen sein.
[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()
}