diff --git a/benchmarks/serde-benchmarks/model/operations/CopyObject.smithy b/benchmarks/serde-benchmarks/model/operations/CopyObject.smithy
index c7758b897..54c37a4b3 100644
--- a/benchmarks/serde-benchmarks/model/operations/CopyObject.smithy
+++ b/benchmarks/serde-benchmarks/model/operations/CopyObject.smithy
@@ -119,6 +119,66 @@ use smithy.test#httpResponseTests
"""
tags: ["serde-benchmark"]
}
+ // section: out-of-order + unknown fields
+ {
+ id: "restXml_CopyObjectOutput_OutOfOrder"
+ documentation: """
+ Fields in reverse order with unknown elements interspersed.
+ """
+ protocol: restXml
+ code: 200
+ headers: { "x-amz-expiration": "expiry-date=\"Fri, 01 Jan 2022 00:00:00 GMT\", rule-id=\"rule1\"", "x-amz-copy-source-version-id": "source-version-id-12345", "x-amz-version-id": "dest-version-id-67890", "x-amz-server-side-encryption": "AES256", "x-amz-server-side-encryption-customer-algorithm": "AES256", "x-amz-server-side-encryption-customer-key-MD5": "customer-key-md5-hash", "x-amz-server-side-encryption-aws-kms-key-id": "arn:aws:kms:us-east-1:123456789012:key/12345678-1234-1234-1234-123456789012", "x-amz-server-side-encryption-context": "encryption-context", "x-amz-server-side-encryption-bucket-key-enabled": "true", "x-amz-request-charged": "requester" }
+ body: """
+
+ skip-this-value
+ checksum-sha256
+ checksum-sha1
+
+ should-be-ignored
+
+ checksum-crc64nvme
+ checksum-crc32c
+ checksum-crc32
+ true
+ SHA256
+ 2021-01-01T00:00:00.000Z
+
+ - one
+ - two
+
+ "9bb58f26192e4ba00f01e2e7b136bbd8"
+ 0
+
+ """
+ tags: ["serde-benchmark"]
+ }
+ {
+ id: "restJson1_CopyObjectOutput_OutOfOrder"
+ documentation: """
+ Fields in reverse order with unknown fields interspersed.
+ """
+ protocol: restJson1
+ code: 200
+ headers: { "x-amz-expiration": "expiry-date=\"Fri, 01 Jan 2022 00:00:00 GMT\", rule-id=\"rule1\"", "x-amz-copy-source-version-id": "source-version-id-12345", "x-amz-version-id": "dest-version-id-67890", "x-amz-server-side-encryption": "AES256", "x-amz-server-side-encryption-customer-algorithm": "AES256", "x-amz-server-side-encryption-customer-key-MD5": "customer-key-md5-hash", "x-amz-server-side-encryption-aws-kms-key-id": "arn:aws:kms:us-east-1:123456789012:key/12345678-1234-1234-1234-123456789012", "x-amz-server-side-encryption-context": "encryption-context", "x-amz-server-side-encryption-bucket-key-enabled": "true", "x-amz-request-charged": "requester" }
+ body: """
+ {
+ "__unknownFirst": "skip-me",
+ "ChecksumSHA256": "checksum-sha256",
+ "ChecksumSHA1": "checksum-sha1",
+ "__unknownMiddleObj": {"foo": "bar", "num": 123},
+ "ChecksumCRC64NVME": "checksum-crc64nvme",
+ "ChecksumCRC32C": "checksum-crc32c",
+ "ChecksumCRC32": "checksum-crc32",
+ "__unknownBool": false,
+ "ChecksumType": "SHA256",
+ "LastModified": 1609459200,
+ "__unknownArray": [1, "two", true],
+ "ETag": "\\"9bb58f26192e4ba00f01e2e7b136bbd8\\"",
+ "__unknownLast": 0
+ }
+ """
+ tags: ["serde-benchmark"]
+ }
])
operation CopyObject {
input: CopyObjectRequest
diff --git a/benchmarks/serde-benchmarks/model/operations/GetItem.smithy b/benchmarks/serde-benchmarks/model/operations/GetItem.smithy
index bfd778ca0..1f5dcbb04 100644
--- a/benchmarks/serde-benchmarks/model/operations/GetItem.smithy
+++ b/benchmarks/serde-benchmarks/model/operations/GetItem.smithy
@@ -1947,6 +1947,87 @@ use smithy.test#httpResponseTests
"""
tags: ["serde-benchmark"]
}
+ // section: out-of-order + unknown fields
+ {
+ id: "awsJson1_0_GetItemOutput_OutOfOrder"
+ documentation: """
+ Fields in reverse order with unknown fields interspersed.
+ """
+ protocol: awsJson1_0
+ code: 200
+ body: """
+ {
+ "__unknownString": "unexpected",
+ "ConsumedCapacity": {
+ "ReadCapacityUnits": 2.5,
+ "__unknownBool": true,
+ "CapacityUnits": 2.5,
+ "TableName": "pasta-recipes"
+ },
+ "__unknownNumber": 99999,
+ "Item": {
+ "nutrition": {
+ "M": {
+ "__unknownNested": { "S": "should-be-skipped" },
+ "fat": { "N": "28" },
+ "carbs": { "N": "45" },
+ "protein": { "N": "18" },
+ "calories": { "N": "520" }
+ }
+ },
+ "ingredients": {
+ "L": [
+ { "M": { "amount": { "S": "1/2 cup" }, "item": { "S": "heavy cream" } } },
+ { "M": { "amount": { "S": "1 cup grated" }, "item": { "S": "parmesan cheese" } } },
+ { "M": { "amount": { "S": "1/2 cup" }, "item": { "S": "butter" } } },
+ { "M": { "amount": { "S": "1 lb" }, "item": { "S": "fettuccine pasta" } } }
+ ]
+ },
+ "tags": { "SS": ["vegetarian", "comfort-food", "creamy"] },
+ "rating": { "N": "4.6" },
+ "servings": { "N": "4" },
+ "cuisine": { "S": "Italian" },
+ "difficulty": { "S": "Easy" },
+ "prep_time": { "N": "15" },
+ "cook_time": { "N": "25" },
+ "description": {
+ "S": "Creamy, rich pasta dish with butter, parmesan cheese, and fresh fettuccine noodles"
+ },
+ "name": { "S": "Fettuccine Alfredo" },
+ "id": { "S": "recipe-002" }
+ },
+ "__unknownArray": [1, 2, 3],
+ "__unknownObject": { "nested": "value", "count": 42 }
+ }
+ """
+ tags: ["serde-benchmark"]
+ }
+ {
+ id: "rpcv2Cbor_GetItemOutput_OutOfOrder"
+ documentation: """
+ Fields in reverse order with unknown fields interspersed (CBOR).
+ """
+ protocol: rpcv2Cbor
+ headers: { "smithy-protocol": "rpc-v2-cbor" }
+ code: 200
+ body: """
+ pm9fX3Vua25vd25TdHJpbmdqdW5leHBlY3RlZHBDb25zdW1lZENhcGFjaXR5pHFSZWFkQ2FwYWNp
+ dHlVbml0c/tABAAAAAAAAG1fX3Vua25vd25Cb29s9W1DYXBhY2l0eVVuaXRz+0AEAAAAAAAAaVRh
+ YmxlTmFtZW1wYXN0YS1yZWNpcGVzb19fdW5rbm93bk51bWJlchoAAYafZEl0ZW2saW51dHJpdGlv
+ bqFhTaVvX191bmtub3duTmVzdGVkoWFTcXNob3VsZC1iZS1za2lwcGVkY2ZhdKFhTmIyOGVjYXJi
+ c6FhTmI0NWdwcm90ZWluoWFOYjE4aGNhbG9yaWVzoWFOYzUyMGtpbmdyZWRpZW50c6FhTIShYU2i
+ ZmFtb3VudKFhU2cxLzIgY3VwZGl0ZW2hYVNraGVhdnkgY3JlYW2hYU2iZmFtb3VudKFhU2wxIGN1
+ cCBncmF0ZWRkaXRlbaFhU29wYXJtZXNhbiBjaGVlc2WhYU2iZmFtb3VudKFhU2cxLzIgY3VwZGl0
+ ZW2hYVNmYnV0dGVyoWFNomZhbW91bnShYVNkMSBsYmRpdGVtoWFTcGZldHR1Y2NpbmUgcGFzdGFk
+ dGFnc6FiU1ODanZlZ2V0YXJpYW5sY29tZm9ydC1mb29kZmNyZWFteWZyYXRpbmehYU5jNC42aHNl
+ cnZpbmdzoWFOYTRnY3Vpc2luZaFhU2dJdGFsaWFuamRpZmZpY3VsdHmhYVNkRWFzeWlwcmVwX3Rp
+ bWWhYU5iMTVpY29va190aW1loWFOYjI1a2Rlc2NyaXB0aW9uoWFTeFJDcmVhbXksIHJpY2ggcGFz
+ dGEgZGlzaCB3aXRoIGJ1dHRlciwgcGFybWVzYW4gY2hlZXNlLCBhbmQgZnJlc2ggZmV0dHVjY2lu
+ ZSBub29kbGVzZG5hbWWhYVNyRmV0dHVjY2luZSBBbGZyZWRvYmlkoWFTanJlY2lwZS0wMDJuX191
+ bmtub3duQXJyYXmDAQIDb19fdW5rbm93bk9iamVjdKJmbmVzdGVkZXZhbHVlZWNvdW50GCo=
+ """
+ tags: ["serde-benchmark"]
+ }
])
operation GetItem {
input: GetItemInput
diff --git a/benchmarks/serde-benchmarks/model/operations/GetMetricData.smithy b/benchmarks/serde-benchmarks/model/operations/GetMetricData.smithy
index 563472f28..f1d53a788 100644
--- a/benchmarks/serde-benchmarks/model/operations/GetMetricData.smithy
+++ b/benchmarks/serde-benchmarks/model/operations/GetMetricData.smithy
@@ -2955,6 +2955,249 @@ use smithy.test#httpResponseTests
}
tags: ["serde-benchmark"]
}
+ // section: out-of-order + unknown fields
+ {
+ id: "awsQuery_GetMetricDataResponse_OutOfOrder"
+ documentation: """
+ Fields in reverse order with unknown elements interspersed.
+ """
+ protocol: awsQuery
+ code: 200
+ body: """
+
+
+ should-skip
+
+
+ InfoOnly
+ Some metrics delayed
+
+
+ nextTokenValue123
+
+
+ skip
+ Complete
+
+ 72.5
+ 75
+
+
+ 2021-01-01T00:05:00Z
+ 2021-01-01T00:00:00Z
+
+
+ m1
+
+
+ Complete
+
+ 58
+ 60
+
+
+ 2021-01-01T00:05:00Z
+ 2021-01-01T00:00:00Z
+
+
+ m2
+
+
+ Complete
+
+ 47
+ 45
+
+
+ 2021-01-01T00:05:00Z
+ 2021-01-01T00:00:00Z
+
+
+ m3
+
+
+ Complete
+
+ 1100
+ 1024
+
+
+ 2021-01-01T00:05:00Z
+ 2021-01-01T00:00:00Z
+
+
+ m4
+
+
+ Complete
+
+ 2200
+ 2048
+
+
+ 2021-01-01T00:05:00Z
+ 2021-01-01T00:00:00Z
+
+
+ m5
+
+
+ Complete
+
+ 95
+ 100
+
+
+ 2021-01-01T00:05:00Z
+ 2021-01-01T00:00:00Z
+
+
+ m6
+
+
+ Complete
+
+ 145
+ 150
+
+
+ 2021-01-01T00:05:00Z
+ 2021-01-01T00:00:00Z
+
+
+ m7
+
+
+ Complete
+
+ 48
+ 50
+
+
+ 2021-01-01T00:05:00Z
+ 2021-01-01T00:00:00Z
+
+
+ m8
+
+
+ Complete
+
+ 72
+ 75
+
+
+ 2021-01-01T00:05:00Z
+ 2021-01-01T00:00:00Z
+
+
+ m9
+
+
+ Complete
+
+ 0
+ 0
+
+
+ 2021-01-01T00:05:00Z
+ 2021-01-01T00:00:00Z
+
+
+ m10
+
+
+ also-skip
+
+
+ 12345678-1234-1234-1234-123456789014
+
+
+ """
+ params: {
+ MetricDataResults: [
+ {
+ Id: "m1"
+ Label: "alpacas_found"
+ Timestamps: [1609459200, 1609459500]
+ Values: [75.0, 72.5]
+ StatusCode: "Complete"
+ }
+ {
+ Id: "m2"
+ Label: "llamas_sleeping"
+ Timestamps: [1609459200, 1609459500]
+ Values: [60.0, 58.0]
+ StatusCode: "Complete"
+ }
+ {
+ Id: "m3"
+ Label: "penguins_waddling"
+ Timestamps: [1609459200, 1609459500]
+ Values: [45.0, 47.0]
+ StatusCode: "Complete"
+ }
+ {
+ Id: "m4"
+ Label: "dolphins_jumping"
+ Timestamps: [1609459200, 1609459500]
+ Values: [1024.0, 1100.0]
+ StatusCode: "Complete"
+ }
+ {
+ Id: "m5"
+ Label: "elephants_trumpeting"
+ Timestamps: [1609459200, 1609459500]
+ Values: [2048.0, 2200.0]
+ StatusCode: "Complete"
+ }
+ {
+ Id: "m6"
+ Label: "giraffes_eating"
+ Timestamps: [1609459200, 1609459500]
+ Values: [100.0, 95.0]
+ StatusCode: "Complete"
+ }
+ {
+ Id: "m7"
+ Label: "zebras_running"
+ Timestamps: [1609459200, 1609459500]
+ Values: [150.0, 145.0]
+ StatusCode: "Complete"
+ }
+ {
+ Id: "m8"
+ Label: "pandas_munching"
+ Timestamps: [1609459200, 1609459500]
+ Values: [50.0, 48.0]
+ StatusCode: "Complete"
+ }
+ {
+ Id: "m9"
+ Label: "koalas_napping"
+ Timestamps: [1609459200, 1609459500]
+ Values: [75.0, 72.0]
+ StatusCode: "Complete"
+ }
+ {
+ Id: "m10"
+ Label: "kangaroos_hopping"
+ Timestamps: [1609459200, 1609459500]
+ Values: [0.0, 0.0]
+ StatusCode: "Complete"
+ }
+ ]
+ NextToken: "nextTokenValue123"
+ Messages: [
+ {
+ Code: "InfoOnly"
+ Value: "Some metrics delayed"
+ }
+ ]
+ }
+ tags: ["serde-benchmark"]
+ }
])
operation GetMetricData {
input: GetMetricDataInput
diff --git a/benchmarks/serde-benchmarks/src/jmh/java/software/amazon/smithy/java/benchmarks/serde/AwsJson1_0DeserializeBenchmark.java b/benchmarks/serde-benchmarks/src/jmh/java/software/amazon/smithy/java/benchmarks/serde/AwsJson1_0DeserializeBenchmark.java
index b4b2b5240..e9155bb3a 100644
--- a/benchmarks/serde-benchmarks/src/jmh/java/software/amazon/smithy/java/benchmarks/serde/AwsJson1_0DeserializeBenchmark.java
+++ b/benchmarks/serde-benchmarks/src/jmh/java/software/amazon/smithy/java/benchmarks/serde/AwsJson1_0DeserializeBenchmark.java
@@ -37,6 +37,7 @@ public class AwsJson1_0DeserializeBenchmark {
"awsJson1_0_GetItemOutput_S",
"awsJson1_0_GetItemOutput_M",
"awsJson1_0_GetItemOutput_L",
+ "awsJson1_0_GetItemOutput_OutOfOrder",
"awsJson1_0_GetItemOutputBinary_S",
"awsJson1_0_GetItemOutputBinary_M",
"awsJson1_0_GetItemOutputBinary_L",
diff --git a/benchmarks/serde-benchmarks/src/jmh/java/software/amazon/smithy/java/benchmarks/serde/AwsQueryDeserializeBenchmark.java b/benchmarks/serde-benchmarks/src/jmh/java/software/amazon/smithy/java/benchmarks/serde/AwsQueryDeserializeBenchmark.java
index bf05d94f6..2709d5550 100644
--- a/benchmarks/serde-benchmarks/src/jmh/java/software/amazon/smithy/java/benchmarks/serde/AwsQueryDeserializeBenchmark.java
+++ b/benchmarks/serde-benchmarks/src/jmh/java/software/amazon/smithy/java/benchmarks/serde/AwsQueryDeserializeBenchmark.java
@@ -35,6 +35,7 @@ public class AwsQueryDeserializeBenchmark {
"awsQuery_GetMetricDataResponse_S",
"awsQuery_GetMetricDataResponse_M",
"awsQuery_GetMetricDataResponse_L",
+ "awsQuery_GetMetricDataResponse_OutOfOrder",
})
public String testCaseId;
diff --git a/benchmarks/serde-benchmarks/src/jmh/java/software/amazon/smithy/java/benchmarks/serde/RestJson1DeserializeBenchmark.java b/benchmarks/serde-benchmarks/src/jmh/java/software/amazon/smithy/java/benchmarks/serde/RestJson1DeserializeBenchmark.java
index e351e93a7..6af7dfab0 100644
--- a/benchmarks/serde-benchmarks/src/jmh/java/software/amazon/smithy/java/benchmarks/serde/RestJson1DeserializeBenchmark.java
+++ b/benchmarks/serde-benchmarks/src/jmh/java/software/amazon/smithy/java/benchmarks/serde/RestJson1DeserializeBenchmark.java
@@ -35,6 +35,7 @@ public class RestJson1DeserializeBenchmark {
@Param({
"restJson1_CopyObjectOutput_Baseline",
"restJson1_CopyObjectOutput_M",
+ "restJson1_CopyObjectOutput_OutOfOrder",
"restJson1_GetObject_S",
"restJson1_GetObject_M",
"restJson1_GetObject_L",
diff --git a/benchmarks/serde-benchmarks/src/jmh/java/software/amazon/smithy/java/benchmarks/serde/RestXmlDeserializeBenchmark.java b/benchmarks/serde-benchmarks/src/jmh/java/software/amazon/smithy/java/benchmarks/serde/RestXmlDeserializeBenchmark.java
index 60ee72420..d6c02c9b2 100644
--- a/benchmarks/serde-benchmarks/src/jmh/java/software/amazon/smithy/java/benchmarks/serde/RestXmlDeserializeBenchmark.java
+++ b/benchmarks/serde-benchmarks/src/jmh/java/software/amazon/smithy/java/benchmarks/serde/RestXmlDeserializeBenchmark.java
@@ -35,6 +35,7 @@ public class RestXmlDeserializeBenchmark {
@Param({
"restXml_CopyObjectOutput_Baseline",
"restXml_CopyObjectOutput_M",
+ "restXml_CopyObjectOutput_OutOfOrder",
"restXml_GetObject_S",
"restXml_GetObject_M",
"restXml_GetObject_L",
diff --git a/benchmarks/serde-benchmarks/src/jmh/java/software/amazon/smithy/java/benchmarks/serde/RpcV2CborDeserializeBenchmark.java b/benchmarks/serde-benchmarks/src/jmh/java/software/amazon/smithy/java/benchmarks/serde/RpcV2CborDeserializeBenchmark.java
index 6ae937c77..5161ed658 100644
--- a/benchmarks/serde-benchmarks/src/jmh/java/software/amazon/smithy/java/benchmarks/serde/RpcV2CborDeserializeBenchmark.java
+++ b/benchmarks/serde-benchmarks/src/jmh/java/software/amazon/smithy/java/benchmarks/serde/RpcV2CborDeserializeBenchmark.java
@@ -41,6 +41,7 @@ public class RpcV2CborDeserializeBenchmark {
"rpcv2Cbor_GetItemOutput_S",
"rpcv2Cbor_GetItemOutput_M",
"rpcv2Cbor_GetItemOutput_L",
+ "rpcv2Cbor_GetItemOutput_OutOfOrder",
"rpcv2Cbor_GetItemOutputBinary_S",
"rpcv2Cbor_GetItemOutputBinary_M",
"rpcv2Cbor_GetItemOutputBinary_L",