diff --git a/physics/discrete_trajectory_segment_body.hpp b/physics/discrete_trajectory_segment_body.hpp
index d2f51af920..4a13c69a5d 100644
--- a/physics/discrete_trajectory_segment_body.hpp
+++ b/physics/discrete_trajectory_segment_body.hpp
@@ -213,8 +213,10 @@ void DiscreteTrajectorySegment<Frame>::WriteToMessage(
   for (auto const it : exact) {
     exact_set.insert(&*it);
   }
-  exact_set.insert(&*timeline_.cbegin());
-  exact_set.insert(&*timeline_.crbegin());
+  if (!timeline_.empty()) {
+    exact_set.insert(&*timeline_.cbegin());
+    exact_set.insert(&*timeline_.crbegin());
+  }
 
   // Serialize the exact points.
   for (auto const* ptr : exact_set) {
diff --git a/physics/discrete_trajectory_segment_test.cpp b/physics/discrete_trajectory_segment_test.cpp
index b42499dec4..b23ac502db 100644
--- a/physics/discrete_trajectory_segment_test.cpp
+++ b/physics/discrete_trajectory_segment_test.cpp
@@ -443,5 +443,17 @@ TEST_F(DiscreteTrajectorySegmentTest, SerializationRoundTrip) {
   EXPECT_THAT(message2, EqualsProto(message1));
 }
 
+TEST_F(DiscreteTrajectorySegmentTest, SerializationEmpty) {
+  DiscreteTrajectorySegment<World> segment;
+  serialization::DiscreteTrajectorySegment message;
+  segment.WriteToMessage(&message, /*exact=*/{});
+  auto const deserialized_segments = MakeSegments(1);
+  auto& deserialized_segment = *deserialized_segments->begin();
+  deserialized_segment = DiscreteTrajectorySegment<World>::ReadFromMessage(
+      message,
+      /*self=*/MakeIterator(deserialized_segments.get(),
+                            deserialized_segments->begin()));
+}
+
 }  // namespace physics
 }  // namespace principia