From a732606e5517f34dcadc08682e71f8edf1b038b7 Mon Sep 17 00:00:00 2001 From: Oblarg Date: Sun, 15 Mar 2020 01:15:15 -0400 Subject: [PATCH] Geometry classes: remove explicit serializers/deserializers (#2312) Jackson can do this with much less code overhead. --- .../wpi/first/wpilibj/geometry/Pose2d.java | 61 ++++--------------- .../first/wpilibj/geometry/Rotation2d.java | 58 ++++-------------- .../first/wpilibj/geometry/Translation2d.java | 60 ++++-------------- 3 files changed, 35 insertions(+), 144 deletions(-) diff --git a/wpilibj/src/main/java/edu/wpi/first/wpilibj/geometry/Pose2d.java b/wpilibj/src/main/java/edu/wpi/first/wpilibj/geometry/Pose2d.java index 1fa2c8d88c..c6839e600c 100644 --- a/wpilibj/src/main/java/edu/wpi/first/wpilibj/geometry/Pose2d.java +++ b/wpilibj/src/main/java/edu/wpi/first/wpilibj/geometry/Pose2d.java @@ -1,5 +1,5 @@ /*----------------------------------------------------------------------------*/ -/* Copyright (c) 2019 FIRST. All Rights Reserved. */ +/* Copyright (c) 2019-2020 FIRST. All Rights Reserved. */ /* Open Source Software - may be modified and shared by FRC teams. The code */ /* must be accompanied by the FIRST BSD license file in the root directory of */ /* the project. */ @@ -7,25 +7,18 @@ package edu.wpi.first.wpilibj.geometry; -import java.io.IOException; import java.util.Objects; -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.DeserializationContext; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.SerializerProvider; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.databind.deser.std.StdDeserializer; -import com.fasterxml.jackson.databind.ser.std.StdSerializer; +import com.fasterxml.jackson.annotation.JsonAutoDetect; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; /** * Represents a 2d pose containing translational and rotational elements. */ -@JsonSerialize(using = Pose2d.PoseSerializer.class) -@JsonDeserialize(using = Pose2d.PoseDeserializer.class) +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonAutoDetect(getterVisibility = JsonAutoDetect.Visibility.NONE) public class Pose2d { private final Translation2d m_translation; private final Rotation2d m_rotation; @@ -45,7 +38,9 @@ public class Pose2d { * @param translation The translational component of the pose. * @param rotation The rotational component of the pose. */ - public Pose2d(Translation2d translation, Rotation2d rotation) { + @JsonCreator + public Pose2d(@JsonProperty(required = true, value = "translation") Translation2d translation, + @JsonProperty(required = true, value = "rotation") Rotation2d rotation) { m_translation = translation; m_rotation = rotation; } @@ -96,6 +91,7 @@ public class Pose2d { * * @return The translational component of the pose. */ + @JsonProperty public Translation2d getTranslation() { return m_translation; } @@ -105,6 +101,7 @@ public class Pose2d { * * @return The rotational component of the pose. */ + @JsonProperty public Rotation2d getRotation() { return m_rotation; } @@ -234,38 +231,4 @@ public class Pose2d { public int hashCode() { return Objects.hash(m_translation, m_rotation); } - - static class PoseSerializer extends StdSerializer { - PoseSerializer() { - super(Pose2d.class); - } - - @Override - public void serialize( - Pose2d value, JsonGenerator jgen, SerializerProvider provider) - throws IOException, JsonProcessingException { - - jgen.writeStartObject(); - jgen.writeObjectField("translation", value.m_translation); - jgen.writeObjectField("rotation", value.m_rotation); - jgen.writeEndObject(); - } - } - - static class PoseDeserializer extends StdDeserializer { - PoseDeserializer() { - super(Pose2d.class); - } - - @Override - public Pose2d deserialize(JsonParser jp, DeserializationContext ctxt) - throws IOException, JsonProcessingException { - JsonNode node = jp.getCodec().readTree(jp); - - Translation2d translation = - jp.getCodec().treeToValue(node.get("translation"), Translation2d.class); - Rotation2d rotation = jp.getCodec().treeToValue(node.get("rotation"), Rotation2d.class); - return new Pose2d(translation, rotation); - } - } } diff --git a/wpilibj/src/main/java/edu/wpi/first/wpilibj/geometry/Rotation2d.java b/wpilibj/src/main/java/edu/wpi/first/wpilibj/geometry/Rotation2d.java index 288fa5c8aa..e1c25eb385 100644 --- a/wpilibj/src/main/java/edu/wpi/first/wpilibj/geometry/Rotation2d.java +++ b/wpilibj/src/main/java/edu/wpi/first/wpilibj/geometry/Rotation2d.java @@ -1,5 +1,5 @@ /*----------------------------------------------------------------------------*/ -/* Copyright (c) 2019 FIRST. All Rights Reserved. */ +/* Copyright (c) 2019-2020 FIRST. All Rights Reserved. */ /* Open Source Software - may be modified and shared by FRC teams. The code */ /* must be accompanied by the FIRST BSD license file in the root directory of */ /* the project. */ @@ -7,26 +7,19 @@ package edu.wpi.first.wpilibj.geometry; -import java.io.IOException; import java.util.Objects; -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.DeserializationContext; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.SerializerProvider; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.databind.deser.std.StdDeserializer; -import com.fasterxml.jackson.databind.ser.std.StdSerializer; +import com.fasterxml.jackson.annotation.JsonAutoDetect; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; /** * A rotation in a 2d coordinate frame represented a point on the unit circle * (cosine and sine). */ -@JsonSerialize(using = Rotation2d.RotationSerializer.class) -@JsonDeserialize(using = Rotation2d.RotationDeserializer.class) +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonAutoDetect(getterVisibility = JsonAutoDetect.Visibility.NONE) public class Rotation2d { private final double m_value; private final double m_cos; @@ -47,7 +40,8 @@ public class Rotation2d { * * @param value The value of the angle in radians. */ - public Rotation2d(double value) { + @JsonCreator + public Rotation2d(@JsonProperty(required = true, value = "radians") double value) { m_value = value; m_cos = Math.cos(value); m_sin = Math.sin(value); @@ -149,11 +143,12 @@ public class Rotation2d { ); } - /* + /** * Returns the radian value of the rotation. * * @return The radian value of the rotation. */ + @JsonProperty public double getRadians() { return m_value; } @@ -217,35 +212,4 @@ public class Rotation2d { public int hashCode() { return Objects.hash(m_value); } - - static class RotationSerializer extends StdSerializer { - RotationSerializer() { - super(Rotation2d.class); - } - - @Override - public void serialize( - Rotation2d value, JsonGenerator jgen, SerializerProvider provider) - throws IOException, JsonProcessingException { - - jgen.writeStartObject(); - jgen.writeNumberField("radians", value.m_value); - jgen.writeEndObject(); - } - } - - static class RotationDeserializer extends StdDeserializer { - RotationDeserializer() { - super(Rotation2d.class); - } - - @Override - public Rotation2d deserialize(JsonParser jp, DeserializationContext ctxt) - throws IOException, JsonProcessingException { - JsonNode node = jp.getCodec().readTree(jp); - double radians = node.get("radians").numberValue().doubleValue(); - - return new Rotation2d(radians); - } - } } diff --git a/wpilibj/src/main/java/edu/wpi/first/wpilibj/geometry/Translation2d.java b/wpilibj/src/main/java/edu/wpi/first/wpilibj/geometry/Translation2d.java index 73b0257dc3..3ec5f18b06 100644 --- a/wpilibj/src/main/java/edu/wpi/first/wpilibj/geometry/Translation2d.java +++ b/wpilibj/src/main/java/edu/wpi/first/wpilibj/geometry/Translation2d.java @@ -1,5 +1,5 @@ /*----------------------------------------------------------------------------*/ -/* Copyright (c) 2019 FIRST. All Rights Reserved. */ +/* Copyright (c) 2019-2020 FIRST. All Rights Reserved. */ /* Open Source Software - may be modified and shared by FRC teams. The code */ /* must be accompanied by the FIRST BSD license file in the root directory of */ /* the project. */ @@ -7,19 +7,12 @@ package edu.wpi.first.wpilibj.geometry; -import java.io.IOException; import java.util.Objects; -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.DeserializationContext; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.SerializerProvider; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.databind.deser.std.StdDeserializer; -import com.fasterxml.jackson.databind.ser.std.StdSerializer; +import com.fasterxml.jackson.annotation.JsonAutoDetect; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; /** * Represents a translation in 2d space. @@ -29,9 +22,9 @@ import com.fasterxml.jackson.databind.ser.std.StdSerializer; * When the robot is placed on the origin, facing toward the X direction, * moving forward increases the X, whereas moving to the left increases the Y. */ -@JsonSerialize(using = Translation2d.TranslationSerializer.class) -@JsonDeserialize(using = Translation2d.TranslationDeserializer.class) @SuppressWarnings({"ParameterName", "MemberName"}) +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonAutoDetect(getterVisibility = JsonAutoDetect.Visibility.NONE) public class Translation2d { private final double m_x; private final double m_y; @@ -50,7 +43,9 @@ public class Translation2d { * @param x The x component of the translation. * @param y The y component of the translation. */ - public Translation2d(double x, double y) { + @JsonCreator + public Translation2d(@JsonProperty(required = true, value = "x") double x, + @JsonProperty(required = true, value = "y") double y) { m_x = x; m_y = y; } @@ -73,6 +68,7 @@ public class Translation2d { * * @return The x component of the translation. */ + @JsonProperty public double getX() { return m_x; } @@ -82,6 +78,7 @@ public class Translation2d { * * @return The y component of the translation. */ + @JsonProperty public double getY() { return m_y; } @@ -203,37 +200,4 @@ public class Translation2d { public int hashCode() { return Objects.hash(m_x, m_y); } - - static class TranslationSerializer extends StdSerializer { - TranslationSerializer() { - super(Translation2d.class); - } - - @Override - public void serialize( - Translation2d value, JsonGenerator jgen, SerializerProvider provider) - throws IOException, JsonProcessingException { - - jgen.writeStartObject(); - jgen.writeNumberField("x", value.m_x); - jgen.writeNumberField("y", value.m_y); - jgen.writeEndObject(); - } - } - - static class TranslationDeserializer extends StdDeserializer { - TranslationDeserializer() { - super(Translation2d.class); - } - - @Override - public Translation2d deserialize(JsonParser jp, DeserializationContext ctxt) - throws IOException, JsonProcessingException { - JsonNode node = jp.getCodec().readTree(jp); - double xval = node.get("x").numberValue().doubleValue(); - double yval = node.get("y").numberValue().doubleValue(); - - return new Translation2d(xval, yval); - } - } }