Opmerkingen over serialisatie van het type Reliable Actors van Service Fabric

De argumenten van alle methoden, resultaattypen van de taken die door elke methode in een actorinterface worden geretourneerd en objecten die zijn opgeslagen in de statusmanager van een actor, moeten serialiseerbaar zijn voor gegevenscontracten. Dit geldt ook voor de argumenten van de methoden die zijn gedefinieerd in actorgebeurtenisinterfaces. (Methoden voor actor-gebeurtenisinterface retourneren altijd een ongeldige waarde.)

Aangepaste gegevenstypen

In dit voorbeeld definieert de volgende actorinterface een methode die een aangepast gegevenstype retourneert met de naam VoicemailBox:

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

De interface wordt geïmplementeerd door een actor die de statusbeheerder gebruikt om een VoicemailBox object op te slaan:

[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 dit voorbeeld wordt het VoicemailBox object geserialiseerd wanneer:

  • Het object wordt verzonden tussen een actorexemplaar en een aanroeper.
  • Het object wordt opgeslagen in statusbeheer, waar het wordt opgeslagen op schijf en wordt gerepliceerd naar andere knooppunten.

Het Reliable Actor-framework maakt gebruik van DataContract-serialisatie. Daarom moeten de aangepaste gegevensobjecten en de bijbehorende leden worden geannoteerd met respectievelijk de kenmerken DataContract en DataMember .

[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()
}

Volgende stappen