From 168f1ac3ff13b0514e2123e35b7debe9f966d670 Mon Sep 17 00:00:00 2001 From: Kyle Ambroff Date: Fri, 24 Sep 2010 15:49:44 -0700 Subject: [PATCH] [corlib] version tolerant serialization fails with missing primitive members Modifies ObjectReader so that when it encounters a primitive typed member in an object stream which has no corresponding member in the app domain, it will read the value anyway and throw it away. That way it can read the next block from the stream. Added a unit test which passes with the changes to ObjectReader. Fixes bug #641821. --- mcs/class/corlib/Makefile | 2 ++ .../ObjectReader.cs | 17 ++++++++++---- .../BinarySerializationOverVersions.cs | 12 ++++++++++ .../6.0/Address.cs | 22 +++++++++++++++++++ 4 files changed, 49 insertions(+), 4 deletions(-) create mode 100644 mcs/class/corlib/Test/System.Runtime.Serialization.Formatters.Binary/VersionTolerantSerialization/VersionTolerantSerializationTestLib/6.0/Address.cs diff --git a/mcs/class/corlib/Makefile b/mcs/class/corlib/Makefile index 25cdd80c95aa..5f6733df4bdb 100644 --- a/mcs/class/corlib/Makefile +++ b/mcs/class/corlib/Makefile @@ -90,6 +90,8 @@ test-vts: $(vtsdir)/$(vts)TestLib/4.0/Address.cs $(MCS) -target:library \ $(vtsdir)/$(vts)TestLib/5.0/Address.cs + $(MCS) -target:library \ + $(vtsdir)/$(vts)TestLib/6.0/Address.cs run-test-vts: test-vts $(TEST_RUNTIME) $(RUNTIME_FLAGS) $(TEST_HARNESS) -noshadow \ $(vtsdir)/BinarySerializationOverVersions.exe diff --git a/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ObjectReader.cs b/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ObjectReader.cs index 3393930dae5b..dd9b27513a8e 100644 --- a/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ObjectReader.cs +++ b/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ObjectReader.cs @@ -294,13 +294,22 @@ private void ReadObjectContent (BinaryReader reader, TypeMetadata metadata, long info = metadata.NeedsSerializationInfo ? new SerializationInfo(metadata.Type, new FormatterConverter()) : null; - if (metadata.MemberNames != null) + if (metadata.MemberNames != null) { for (int n=0; n