Fixed bug spotted by danielr
diff --git a/src/ProtocolBuffers.Test/GeneratedMessageTest.cs b/src/ProtocolBuffers.Test/GeneratedMessageTest.cs
index aee11d8..5f98817 100644
--- a/src/ProtocolBuffers.Test/GeneratedMessageTest.cs
+++ b/src/ProtocolBuffers.Test/GeneratedMessageTest.cs
@@ -452,5 +452,11 @@
       Assert.AreEqual(UnitTestProtoFile.RepeatedNestedMessageExtensionFieldNumber, 48);
       Assert.AreEqual(UnitTestProtoFile.RepeatedNestedEnumExtensionFieldNumber, 51);
     }
+
+    [Test]
+    public void EmptyPackedValue() {
+      TestPackedTypes empty = new TestPackedTypes.Builder().Build();
+      Assert.AreEqual(0, empty.SerializedSize);
+    }
   }
 }
diff --git a/src/ProtocolBuffers.Test/TestProtos/UnitTestProtoFile.cs b/src/ProtocolBuffers.Test/TestProtos/UnitTestProtoFile.cs
index 123b5ec..811556d 100644
--- a/src/ProtocolBuffers.Test/TestProtos/UnitTestProtoFile.cs
+++ b/src/ProtocolBuffers.Test/TestProtos/UnitTestProtoFile.cs
@@ -12765,8 +12765,9 @@
             dataSize += pb::CodedOutputStream.ComputeInt32SizeNoTag(element);
           }
           size += dataSize;
-          size += 2;
-          size += pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
+          if (packedInt32_.Count != 0) {
+            size += 2 + pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
+          }
           packedInt32MemoizedSerializedSize = dataSize;
         }
         {
@@ -12775,8 +12776,9 @@
             dataSize += pb::CodedOutputStream.ComputeInt64SizeNoTag(element);
           }
           size += dataSize;
-          size += 2;
-          size += pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
+          if (packedInt64_.Count != 0) {
+            size += 2 + pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
+          }
           packedInt64MemoizedSerializedSize = dataSize;
         }
         {
@@ -12785,8 +12787,9 @@
             dataSize += pb::CodedOutputStream.ComputeUInt32SizeNoTag(element);
           }
           size += dataSize;
-          size += 2;
-          size += pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
+          if (packedUint32_.Count != 0) {
+            size += 2 + pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
+          }
           packedUint32MemoizedSerializedSize = dataSize;
         }
         {
@@ -12795,8 +12798,9 @@
             dataSize += pb::CodedOutputStream.ComputeUInt64SizeNoTag(element);
           }
           size += dataSize;
-          size += 2;
-          size += pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
+          if (packedUint64_.Count != 0) {
+            size += 2 + pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
+          }
           packedUint64MemoizedSerializedSize = dataSize;
         }
         {
@@ -12805,8 +12809,9 @@
             dataSize += pb::CodedOutputStream.ComputeSInt32SizeNoTag(element);
           }
           size += dataSize;
-          size += 2;
-          size += pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
+          if (packedSint32_.Count != 0) {
+            size += 2 + pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
+          }
           packedSint32MemoizedSerializedSize = dataSize;
         }
         {
@@ -12815,64 +12820,72 @@
             dataSize += pb::CodedOutputStream.ComputeSInt64SizeNoTag(element);
           }
           size += dataSize;
-          size += 2;
-          size += pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
+          if (packedSint64_.Count != 0) {
+            size += 2 + pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
+          }
           packedSint64MemoizedSerializedSize = dataSize;
         }
         {
           int dataSize = 0;
           dataSize = 4 * packedFixed32_.Count;
           size += dataSize;
-          size += 2;
-          size += pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
+          if (packedFixed32_.Count != 0) {
+            size += 2 + pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
+          }
           packedFixed32MemoizedSerializedSize = dataSize;
         }
         {
           int dataSize = 0;
           dataSize = 8 * packedFixed64_.Count;
           size += dataSize;
-          size += 2;
-          size += pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
+          if (packedFixed64_.Count != 0) {
+            size += 2 + pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
+          }
           packedFixed64MemoizedSerializedSize = dataSize;
         }
         {
           int dataSize = 0;
           dataSize = 4 * packedSfixed32_.Count;
           size += dataSize;
-          size += 2;
-          size += pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
+          if (packedSfixed32_.Count != 0) {
+            size += 2 + pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
+          }
           packedSfixed32MemoizedSerializedSize = dataSize;
         }
         {
           int dataSize = 0;
           dataSize = 8 * packedSfixed64_.Count;
           size += dataSize;
-          size += 2;
-          size += pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
+          if (packedSfixed64_.Count != 0) {
+            size += 2 + pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
+          }
           packedSfixed64MemoizedSerializedSize = dataSize;
         }
         {
           int dataSize = 0;
           dataSize = 4 * packedFloat_.Count;
           size += dataSize;
-          size += 2;
-          size += pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
+          if (packedFloat_.Count != 0) {
+            size += 2 + pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
+          }
           packedFloatMemoizedSerializedSize = dataSize;
         }
         {
           int dataSize = 0;
           dataSize = 8 * packedDouble_.Count;
           size += dataSize;
-          size += 2;
-          size += pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
+          if (packedDouble_.Count != 0) {
+            size += 2 + pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
+          }
           packedDoubleMemoizedSerializedSize = dataSize;
         }
         {
           int dataSize = 0;
           dataSize = 1 * packedBool_.Count;
           size += dataSize;
-          size += 2;
-          size += pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
+          if (packedBool_.Count != 0) {
+            size += 2 + pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
+          }
           packedBoolMemoizedSerializedSize = dataSize;
         }
         {