[ObjC] Support MessageSet with `GPBUnknownFields`.

Update the initialization from a message to deal with the current differences.

Update some tests to cover the usage.

PiperOrigin-RevId: 652892603
diff --git a/objectivec/GPBUnknownFields.m b/objectivec/GPBUnknownFields.m
index e24e07b..f3073ad 100644
--- a/objectivec/GPBUnknownFields.m
+++ b/objectivec/GPBUnknownFields.m
@@ -12,6 +12,7 @@
 #import "GPBCodedInputStream_PackagePrivate.h"
 #import "GPBCodedOutputStream.h"
 #import "GPBCodedOutputStream_PackagePrivate.h"
+#import "GPBDescriptor.h"
 #import "GPBMessage.h"
 #import "GPBUnknownField.h"
 #import "GPBUnknownFieldSet_PackagePrivate.h"
@@ -199,8 +200,19 @@
     // updated.
     GPBUnknownFieldSet *legacyUnknownFields = [message unknownFields];
     if (legacyUnknownFields) {
-      GPBCodedInputStream *input =
-          [[GPBCodedInputStream alloc] initWithData:[legacyUnknownFields data]];
+      NSData *data;
+      if (message.descriptor.isWireFormat) {
+        NSMutableData *mutableData =
+            [NSMutableData dataWithLength:legacyUnknownFields.serializedSizeAsMessageSet];
+        GPBCodedOutputStream *output = [[GPBCodedOutputStream alloc] initWithData:mutableData];
+        [legacyUnknownFields writeAsMessageSetTo:output];
+        [output flush];
+        [output release];
+        data = mutableData;
+      } else {
+        data = [legacyUnknownFields data];
+      }
+      GPBCodedInputStream *input = [[GPBCodedInputStream alloc] initWithData:data];
       // Parse until the end of the data (tag will be zero).
       if (!MergeFromInputStream(self, input, 0)) {
         [input release];