Catatan tentang serialisasi jenis Reliable Actor Service Fabric

Argumen dari semua metode, jenis hasil tugas yang dikembalikan oleh setiap metode dalam antarmuka aktor, dan objek yang disimpan dalam pengelola status aktor harus kontrak data yang dapat diserialisasi. Ini juga berlaku untuk argumen metode yang ditentukan dalam antarmuka peristiwa aktor. (Metode antarmuka peristiwa aktor selalu kembali dengan gagal.)

Jenis data kustom

Dalam contoh ini, antarmuka aktor berikut menentukan metode yang mengembalikan jenis data kustom yang disebut VoicemailBox:

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

Antarmuka diimplementasikan oleh aktor yang menggunakan pengelola status untuk menyimpan objek 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");
    }
}

Dalam contoh ini, objek VoicemailBox diserialisasikan ketika:

  • Objek ditransmisikan antara instans aktor dan pemanggil.
  • Objek disimpan di pengelola status tempat objek dipertahankan ke disk dan direplikasi ke node lainnya.

Kerangka kerja Reliable Actor menggunakan serialisasi DataContract. Oleh karena itu, objek data kustom dan anggotanya harus dianotasikan dengan DataContract dan 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()
}

Langkah berikutnya