Dela via


Anteckningar om Service Fabric Reliable Actors-typserialisering

Argumenten för alla metoder, resultattyperna för de uppgifter som returneras av varje metod i ett aktörsgränssnitt och objekt som lagras i en aktörs tillståndshanterare måste vara serialiserbara för datakontrakt. Detta gäller även argumenten för de metoder som definieras i aktörens händelsegränssnitt. (Metoder för aktörshändelsegränssnitt returnerar alltid void.)

Anpassade datatyper

I det här exemplet definierar följande aktörsgränssnitt en metod som returnerar en anpassad datatyp med namnet VoicemailBox:

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

Gränssnittet implementeras av en aktör som använder tillståndshanteraren för att lagra ett VoicemailBox objekt:

[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");
    }
}

I det här exemplet serialiseras objektet VoicemailBox när:

  • Objektet överförs mellan en aktörsinstans och en anropare.
  • Objektet sparas i tillståndshanteraren där det sparas på disken och replikeras till andra noder.

Reliable Actor-ramverket använder DataContract-serialisering. Därför måste anpassade dataobjekt och deras medlemmar kommenteras med attributen DataContract respektive 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()
}

Nästa steg