Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,12 @@ public ClusterMetricsMessageSerializer(ExtendedActorSystem system)
_serialization = new Lazy<Akka.Serialization.Serialization>(() => new Akka.Serialization.Serialization(system));
}

/// <inheritdoc />
/// <remarks>
/// A subclass keeps resolving its own id from HOCON via <see cref="Serializer.Identifier"/>.
/// </remarks>
public override int Identifier => GetType() == typeof(ClusterMetricsMessageSerializer) ? 10 : base.Identifier;

/// <inheritdoc />
public override byte[] ToBinary(object obj)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,12 @@ public ClusterShardingMessageSerializer(ExtendedActorSystem system) : base(syste
};
}

/// <inheritdoc />
/// <remarks>
/// A subclass keeps resolving its own id from HOCON via <see cref="Serializer.Identifier"/>.
/// </remarks>
public override int Identifier => GetType() == typeof(ClusterShardingMessageSerializer) ? 13 : base.Identifier;

private ShardingEnvelope ShardingEnvelopeFromBinary(byte[] bytes)
{
var proto = Proto.Msg.ShardingEnvelope.Parser.ParseFrom(bytes);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,12 @@ public ClusterClientMessageSerializer(ExtendedActorSystem system) : base(system)
_payloadSupport = new WrappedPayloadSupport(system);
}

/// <inheritdoc />
/// <remarks>
/// A subclass keeps resolving its own id from HOCON via <see cref="Serializer.Identifier"/>.
/// </remarks>
public override int Identifier => GetType() == typeof(ClusterClientMessageSerializer) ? 15 : base.Identifier;

/// <summary>
/// Serializes the given object into a byte array
/// </summary>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,12 @@ public DistributedPubSubMessageSerializer(ExtendedActorSystem system) : base(sys
};
}

/// <inheritdoc />
/// <remarks>
/// A subclass keeps resolving its own id from HOCON via <see cref="Serializer.Identifier"/>.
/// </remarks>
public override int Identifier => GetType() == typeof(DistributedPubSubMessageSerializer) ? 9 : base.Identifier;

/// <summary>
/// Serializes the given object into a byte array
/// </summary>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,12 @@ public ClusterSingletonMessageSerializer(ExtendedActorSystem system) : base(syst
};
}

/// <inheritdoc />
/// <remarks>
/// A subclass keeps resolving its own id from HOCON via <see cref="Serializer.Identifier"/>.
/// </remarks>
public override int Identifier => GetType() == typeof(ClusterSingletonMessageSerializer) ? 14 : base.Identifier;

/// <summary>
/// Serializes the given object into a byte array
/// </summary>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,8 @@ public ReplicatedDataSerializer(ExtendedActorSystem system) : base(system)
system.Settings.Config.GetBoolean("akka.cluster.sharding.distributed-data.backward-compatible-wire-format");
}

/// <inheritdoc />
public override int Identifier => 11;

public override byte[] ToBinary(object obj)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -168,6 +168,9 @@ public ReplicatorMessageSerializer(Akka.Actor.ExtendedActorSystem system) : base
});
}

/// <inheritdoc />
public override int Identifier => 12;

public override string Manifest(object o)
{
switch (o)
Expand Down
66 changes: 66 additions & 0 deletions src/core/Akka.API.Tests/BuiltInSerializerIdentifierSpec.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
//-----------------------------------------------------------------------
// <copyright file="BuiltInSerializerIdentifierSpec.cs" company="Akka.NET Project">
// Copyright (C) 2009-2025 Lightbend Inc. <http://www.lightbend.com>
// Copyright (C) 2013-2025 .NET Foundation <https://github.com/akkadotnet/akka.net>
// </copyright>
//-----------------------------------------------------------------------

using System;
using System.Runtime.CompilerServices;
using Akka.Actor;
using Akka.Cluster.Metrics;
using Akka.Cluster.Sharding;
using Akka.Cluster.Tools.Client;
using Akka.Cluster.Tools.PublishSubscribe;
using Akka.Cluster.Tools.Singleton;
using Akka.Configuration;
using Akka.Serialization;
using Akka.Streams;
using Xunit;
using DistributedDataExtension = Akka.DistributedData.DistributedData;
using PersistenceExtension = Akka.Persistence.Persistence;

namespace Akka.API.Tests
{
/// <summary>
/// Every built-in serializer now declares its wire id in code. This is the one project that references all of
/// Remote, Cluster, Cluster.Tools, Cluster.Sharding, DistributedData, Cluster.Metrics, Persistence, Streams and
/// core, so it's the one place that can check every built-in serializer's code <see cref="Serializer.Identifier"/>
/// against every module's shipped <c>akka.actor.serialization-identifiers</c> row in a single test.
///
/// Each serializer is created with <see cref="RuntimeHelpers.GetUninitializedObject"/>, which skips the
/// constructor entirely, leaving the instance's actor-system field null. A built-in serializer's <c>Identifier</c>
/// is either a hardcoded constant or a <c>GetType()</c> guard around one - never a HOCON read - so this is safe
/// for all of them. It also proves D1: a serializer that still resolved its id lazily from HOCON would touch the
/// null actor-system field on first access and throw, instead of quietly returning the right answer.
/// </summary>
public class BuiltInSerializerIdentifierSpec
{
[Fact(DisplayName = "Should_match_HOCON_serialization_identifiers_When_reading_every_builtin_serializer_Identifier")]
public void Should_match_HOCON_serialization_identifiers_When_reading_every_builtin_serializer_Identifier()
{
var config = ConfigurationFactory.FromResource<Remote.RemoteSettings>("Akka.Remote.Configuration.Remote.conf")
.WithFallback(ConfigurationFactory.FromResource<Cluster.ClusterSettings>("Akka.Cluster.Configuration.Cluster.conf"))
.WithFallback(ClusterSharding.DefaultConfig())
.WithFallback(ClusterSingleton.DefaultConfig())
.WithFallback(DistributedPubSub.DefaultConfig())
.WithFallback(ClusterClientReceptionist.DefaultConfig())
.WithFallback(DistributedDataExtension.DefaultConfig())
.WithFallback(ClusterMetrics.DefaultConfig())
.WithFallback(PersistenceExtension.DefaultConfig())
.WithFallback(ActorMaterializer.DefaultConfig());

// config only: no ActorSystem needed to read the rows
var rows = config.WithFallback(ConfigurationFactory.Default()).GetConfig("akka.actor.serialization-identifiers");
foreach (var row in rows.AsEnumerable())
{
var type = Type.GetType(row.Key, throwOnError: true);
var expectedId = row.Value.GetInt();

var serializer = (Serializer)RuntimeHelpers.GetUninitializedObject(type);
Assert.True(expectedId == serializer.Identifier,
$"{type.FullName} declared Identifier {serializer.Identifier}, but its HOCON row says {expectedId}");
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -447,6 +447,7 @@ namespace Akka.Cluster.Serialization
public class ClusterMessageSerializer : Akka.Serialization.SerializerWithStringManifest
{
public ClusterMessageSerializer(Akka.Actor.ExtendedActorSystem system) { }
public override int Identifier { get; }
public override object FromBinary(byte[] bytes, string manifest) { }
public override string Manifest(object o) { }
public override byte[] ToBinary(object obj) { }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -447,6 +447,7 @@ namespace Akka.Cluster.Serialization
public class ClusterMessageSerializer : Akka.Serialization.SerializerWithStringManifest
{
public ClusterMessageSerializer(Akka.Actor.ExtendedActorSystem system) { }
public override int Identifier { get; }
public override object FromBinary(byte[] bytes, string manifest) { }
public override string Manifest(object o) { }
public override byte[] ToBinary(object obj) { }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -280,6 +280,7 @@ namespace Akka.Cluster.Metrics.Serialization
public class ClusterMetricsMessageSerializer : Akka.Serialization.SerializerWithStringManifest
{
public ClusterMetricsMessageSerializer(Akka.Actor.ExtendedActorSystem system) { }
public override int Identifier { get; }
public override object FromBinary(byte[] bytes, string manifest) { }
public override string Manifest(object o) { }
public override byte[] ToBinary(object obj) { }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -280,6 +280,7 @@ namespace Akka.Cluster.Metrics.Serialization
public class ClusterMetricsMessageSerializer : Akka.Serialization.SerializerWithStringManifest
{
public ClusterMetricsMessageSerializer(Akka.Actor.ExtendedActorSystem system) { }
public override int Identifier { get; }
public override object FromBinary(byte[] bytes, string manifest) { }
public override string Manifest(object o) { }
public override byte[] ToBinary(object obj) { }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -581,6 +581,7 @@ namespace Akka.Cluster.Sharding.Serialization
public class ClusterShardingMessageSerializer : Akka.Serialization.SerializerWithStringManifest
{
public ClusterShardingMessageSerializer(Akka.Actor.ExtendedActorSystem system) { }
public override int Identifier { get; }
public override object FromBinary(byte[] bytes, string manifest) { }
public override string Manifest(object o) { }
public override byte[] ToBinary(object obj) { }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -581,6 +581,7 @@ namespace Akka.Cluster.Sharding.Serialization
public class ClusterShardingMessageSerializer : Akka.Serialization.SerializerWithStringManifest
{
public ClusterShardingMessageSerializer(Akka.Actor.ExtendedActorSystem system) { }
public override int Identifier { get; }
public override object FromBinary(byte[] bytes, string manifest) { }
public override string Manifest(object o) { }
public override byte[] ToBinary(object obj) { }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -214,6 +214,7 @@ namespace Akka.Cluster.Tools.Client.Serialization
public class ClusterClientMessageSerializer : Akka.Serialization.SerializerWithStringManifest
{
public ClusterClientMessageSerializer(Akka.Actor.ExtendedActorSystem system) { }
public override int Identifier { get; }
public override object FromBinary(byte[] bytes, string manifest) { }
public override string Manifest(object o) { }
public override byte[] ToBinary(object obj) { }
Expand Down Expand Up @@ -423,6 +424,7 @@ namespace Akka.Cluster.Tools.PublishSubscribe.Serialization
public class DistributedPubSubMessageSerializer : Akka.Serialization.SerializerWithStringManifest
{
public DistributedPubSubMessageSerializer(Akka.Actor.ExtendedActorSystem system) { }
public override int Identifier { get; }
public override object FromBinary(byte[] bytes, string manifest) { }
public override string Manifest(object o) { }
public override byte[] ToBinary(object obj) { }
Expand Down Expand Up @@ -584,6 +586,7 @@ namespace Akka.Cluster.Tools.Singleton.Serialization
public class ClusterSingletonMessageSerializer : Akka.Serialization.SerializerWithStringManifest
{
public ClusterSingletonMessageSerializer(Akka.Actor.ExtendedActorSystem system) { }
public override int Identifier { get; }
public override object FromBinary(byte[] bytes, string manifest) { }
public override string Manifest(object o) { }
public override byte[] ToBinary(object obj) { }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -214,6 +214,7 @@ namespace Akka.Cluster.Tools.Client.Serialization
public class ClusterClientMessageSerializer : Akka.Serialization.SerializerWithStringManifest
{
public ClusterClientMessageSerializer(Akka.Actor.ExtendedActorSystem system) { }
public override int Identifier { get; }
public override object FromBinary(byte[] bytes, string manifest) { }
public override string Manifest(object o) { }
public override byte[] ToBinary(object obj) { }
Expand Down Expand Up @@ -423,6 +424,7 @@ namespace Akka.Cluster.Tools.PublishSubscribe.Serialization
public class DistributedPubSubMessageSerializer : Akka.Serialization.SerializerWithStringManifest
{
public DistributedPubSubMessageSerializer(Akka.Actor.ExtendedActorSystem system) { }
public override int Identifier { get; }
public override object FromBinary(byte[] bytes, string manifest) { }
public override string Manifest(object o) { }
public override byte[] ToBinary(object obj) { }
Expand Down Expand Up @@ -584,6 +586,7 @@ namespace Akka.Cluster.Tools.Singleton.Serialization
public class ClusterSingletonMessageSerializer : Akka.Serialization.SerializerWithStringManifest
{
public ClusterSingletonMessageSerializer(Akka.Actor.ExtendedActorSystem system) { }
public override int Identifier { get; }
public override object FromBinary(byte[] bytes, string manifest) { }
public override string Manifest(object o) { }
public override byte[] ToBinary(object obj) { }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5158,6 +5158,7 @@ namespace Akka.Serialization
public class ByteArraySerializer : Akka.Serialization.SerializerV2
{
public ByteArraySerializer(Akka.Actor.ExtendedActorSystem system) { }
public override int Identifier { get; }
public override object Deserialize(System.Buffers.ReadOnlySequence<byte> bytes, string manifest) { }
public override object FromBinary(byte[] bytes, System.Type type) { }
public override object FromBinary(byte[] bytes, string manifest) { }
Expand All @@ -5183,6 +5184,7 @@ namespace Akka.Serialization
public NewtonSoftJsonSerializer(Akka.Actor.ExtendedActorSystem system) { }
public NewtonSoftJsonSerializer(Akka.Actor.ExtendedActorSystem system, Akka.Configuration.Config config) { }
public NewtonSoftJsonSerializer(Akka.Actor.ExtendedActorSystem system, Akka.Serialization.NewtonSoftJsonSerializerSettings settings) { }
public override int Identifier { get; }
public override bool IncludeManifest { get; }
public object Serializer { get; }
public Newtonsoft.Json.JsonSerializerSettings Settings { get; }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5147,6 +5147,7 @@ namespace Akka.Serialization
public class ByteArraySerializer : Akka.Serialization.SerializerV2
{
public ByteArraySerializer(Akka.Actor.ExtendedActorSystem system) { }
public override int Identifier { get; }
public override object Deserialize(System.Buffers.ReadOnlySequence<byte> bytes, string manifest) { }
public override object FromBinary(byte[] bytes, System.Type type) { }
public override object FromBinary(byte[] bytes, string manifest) { }
Expand All @@ -5172,6 +5173,7 @@ namespace Akka.Serialization
public NewtonSoftJsonSerializer(Akka.Actor.ExtendedActorSystem system) { }
public NewtonSoftJsonSerializer(Akka.Actor.ExtendedActorSystem system, Akka.Configuration.Config config) { }
public NewtonSoftJsonSerializer(Akka.Actor.ExtendedActorSystem system, Akka.Serialization.NewtonSoftJsonSerializerSettings settings) { }
public override int Identifier { get; }
public override bool IncludeManifest { get; }
public object Serializer { get; }
public Newtonsoft.Json.JsonSerializerSettings Settings { get; }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1122,13 +1122,15 @@ namespace Akka.DistributedData.Serialization
public sealed class ReplicatedDataSerializer : Akka.Serialization.SerializerWithStringManifest
{
public ReplicatedDataSerializer(Akka.Actor.ExtendedActorSystem system) { }
public override int Identifier { get; }
public override object FromBinary(byte[] bytes, string manifest) { }
public override string Manifest(object o) { }
public override byte[] ToBinary(object obj) { }
}
public sealed class ReplicatorMessageSerializer : Akka.Serialization.SerializerWithStringManifest
{
public ReplicatorMessageSerializer(Akka.Actor.ExtendedActorSystem system) { }
public override int Identifier { get; }
public override object FromBinary(byte[] bytes, string manifest) { }
public override string Manifest(object o) { }
public override byte[] ToBinary(object obj) { }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1122,13 +1122,15 @@ namespace Akka.DistributedData.Serialization
public sealed class ReplicatedDataSerializer : Akka.Serialization.SerializerWithStringManifest
{
public ReplicatedDataSerializer(Akka.Actor.ExtendedActorSystem system) { }
public override int Identifier { get; }
public override object FromBinary(byte[] bytes, string manifest) { }
public override string Manifest(object o) { }
public override byte[] ToBinary(object obj) { }
}
public sealed class ReplicatorMessageSerializer : Akka.Serialization.SerializerWithStringManifest
{
public ReplicatorMessageSerializer(Akka.Actor.ExtendedActorSystem system) { }
public override int Identifier { get; }
public override object FromBinary(byte[] bytes, string manifest) { }
public override string Manifest(object o) { }
public override byte[] ToBinary(object obj) { }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1256,13 +1256,15 @@ namespace Akka.Persistence.Serialization
public sealed class PersistenceMessageSerializer : Akka.Serialization.Serializer
{
public PersistenceMessageSerializer(Akka.Actor.ExtendedActorSystem system) { }
public override int Identifier { get; }
public override bool IncludeManifest { get; }
public override object FromBinary(byte[] bytes, System.Type type) { }
public override byte[] ToBinary(object obj) { }
}
public class PersistenceSnapshotSerializer : Akka.Serialization.Serializer
{
public PersistenceSnapshotSerializer(Akka.Actor.ExtendedActorSystem system) { }
public override int Identifier { get; }
public override bool IncludeManifest { get; }
public override object FromBinary(byte[] bytes, System.Type type) { }
public override byte[] ToBinary(object obj) { }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1256,13 +1256,15 @@ namespace Akka.Persistence.Serialization
public sealed class PersistenceMessageSerializer : Akka.Serialization.Serializer
{
public PersistenceMessageSerializer(Akka.Actor.ExtendedActorSystem system) { }
public override int Identifier { get; }
public override bool IncludeManifest { get; }
public override object FromBinary(byte[] bytes, System.Type type) { }
public override byte[] ToBinary(object obj) { }
}
public class PersistenceSnapshotSerializer : Akka.Serialization.Serializer
{
public PersistenceSnapshotSerializer(Akka.Actor.ExtendedActorSystem system) { }
public override int Identifier { get; }
public override bool IncludeManifest { get; }
public override object FromBinary(byte[] bytes, System.Type type) { }
public override byte[] ToBinary(object obj) { }
Expand Down
Loading
Loading