@@ -22,6 +22,8 @@ import akka.serialization.{ BaseSerializer, SerializationExtension, SerializerWi
2222import akka .util .ClassLoaderObjectInputStream
2323import scala .jdk .CollectionConverters ._
2424
25+ import akka .serialization .DisabledJavaSerializer
26+
2527/**
2628 * Protobuf serializer for [[akka.cluster.metrics.ClusterMetricsMessage ]] types.
2729 */
@@ -186,23 +188,35 @@ class MessageSerializer(val system: ExtendedActorSystem) extends SerializerWithS
186188 cm.NodeMetrics .EWMA .newBuilder().setValue(x.value).setAlpha(x.alpha)
187189 }
188190
189- def numberToProto (number : Number ): cm.NodeMetrics .Number .Builder = {
191+ @ tailrec def numberToProto (number : Number ): cm.NodeMetrics .Number .Builder = {
190192 import cm .NodeMetrics .Number
191193 import cm .NodeMetrics .NumberType
192194 number match {
193195 case n : jl.Double => Number .newBuilder().setType(NumberType .Double ).setValue64(jl.Double .doubleToLongBits(n))
194196 case n : jl.Long => Number .newBuilder().setType(NumberType .Long ).setValue64(n)
195197 case n : jl.Float => Number .newBuilder().setType(NumberType .Float ).setValue32(jl.Float .floatToIntBits(n))
196198 case n : jl.Integer => Number .newBuilder().setType(NumberType .Integer ).setValue32(n)
199+ case n : java.math.BigInteger =>
200+ numberToProto(n.longValue) // this truncation is anyway in MetricNumericConverter
201+ case n : BigInt => numberToProto(n.toLong) // this truncation is anyway in MetricNumericConverter
202+ case n : java.math.BigDecimal =>
203+ numberToProto(n.doubleValue) // this rounding is anyway in MetricNumericConverter
204+ case n : BigDecimal => numberToProto(n.toDouble) // this rounding is anyway in MetricNumericConverter
197205 case _ =>
198- val bos = new ByteArrayOutputStream
199- val out = new ObjectOutputStream (bos)
200- out.writeObject(number)
201- out.close()
202- Number
203- .newBuilder()
204- .setType(NumberType .Serialized )
205- .setSerialized(ByteStringUtils .toProtoByteStringUnsafe(bos.toByteArray))
206+ if (system.settings.AllowJavaSerialization ) {
207+ val bos = new ByteArrayOutputStream
208+ val out = new ObjectOutputStream (bos)
209+ out.writeObject(number)
210+ out.close()
211+ Number
212+ .newBuilder()
213+ .setType(NumberType .Serialized )
214+ .setSerialized(ByteStringUtils .toProtoByteStringUnsafe(bos.toByteArray))
215+ } else {
216+ // this is the default, and it shouldn't happen since all number types should be covered above
217+ throw throw new DisabledJavaSerializer .JavaSerializationException (
218+ s " Unsupported number [ ${number.getClass.getName}], when Java serialization is disabled " )
219+ }
206220 }
207221 }
208222
@@ -253,12 +267,18 @@ class MessageSerializer(val system: ExtendedActorSystem) extends SerializerWithS
253267 case NumberType .Float_VALUE => jl.Float .intBitsToFloat(number.getValue32)
254268 case NumberType .Integer_VALUE => number.getValue32
255269 case NumberType .Serialized_VALUE =>
256- val in = new ClassLoaderObjectInputStream (
257- system.dynamicAccess.classLoader,
258- new ByteArrayInputStream (number.getSerialized.toByteArray))
259- val obj = in.readObject
260- in.close()
261- obj.asInstanceOf [jl.Number ]
270+ if (system.settings.AllowJavaSerialization ) {
271+ val in = new ClassLoaderObjectInputStream (
272+ system.dynamicAccess.classLoader,
273+ new ByteArrayInputStream (number.getSerialized.toByteArray))
274+ val obj = in.readObject
275+ in.close()
276+ obj.asInstanceOf [jl.Number ]
277+ } else {
278+ // this is the default, and it shouldn't happen since all number types should be covered above
279+ throw throw new DisabledJavaSerializer .JavaSerializationException (
280+ s " Unsupported number [ ${number.getClass.getName}], when Java serialization is disabled " )
281+ }
262282 }
263283 }
264284
0 commit comments