Expose SerializationInfo.UpdateValue for corefx
authorStephen Toub <stoub@microsoft.com>
Wed, 27 Jul 2016 14:24:06 +0000 (10:24 -0400)
committerStephen Toub <stoub@microsoft.com>
Wed, 27 Jul 2016 14:39:16 +0000 (10:39 -0400)
ObjectManager in corefx needs to access to SerializationInfo.UpdateValue, which is currently internal.  We don't need to expose UpdateValue in a public contract (which would necessitate adding it to desktop), but by making it public we can give corefx the functionality it needs without needing to move a whole bunch more down from corefx into the runtime.

Commit migrated from https://github.com/dotnet/coreclr/commit/1db5d5a1d9ed28b088f1e808096ca9b330bb2bac

src/coreclr/src/mscorlib/model.xml
src/coreclr/src/mscorlib/ref/mscorlib.cs
src/coreclr/src/mscorlib/src/System/Runtime/Serialization/SerializationInfo.cs

index cad5f78..65c5d39 100644 (file)
       <Member Name="GetDecimal(System.String)" />
       <Member Name="GetDateTime(System.String)" />
       <Member Name="GetString(System.String)" />
+      <Member Name="UpdateValue(System.String,System.Object,System.Type)" />
       <Member MemberType="Property" Name="FullTypeName" />
       <Member MemberType="Property" Name="AssemblyName" />
       <Member MemberType="Property" Name="MemberCount" />
index 6c9f6df..304d350 100644 (file)
@@ -11418,6 +11418,7 @@ namespace System.Runtime.Serialization
         public ulong GetUInt64(string name) { throw null; }
         public object GetValue(string name, Type type) { throw null; }
         public void SetType(Type type) { }
+        public void UpdateValue(string name, object value, Type type) { }
     }
     [System.Runtime.InteropServices.ComVisibleAttribute(true)]
     public sealed class SerializationInfoEnumerator : System.Collections.IEnumerator
index a009033..94e6825 100644 (file)
@@ -408,16 +408,23 @@ namespace System.Runtime.Serialization
         /*=================================UpdateValue==================================
         **Action: Finds the value if it exists in the current data.  If it does, we replace
         **        the values, if not, we append it to the end.  This is useful to the 
-        **        ObjectManager when it's performing fixups, but shouldn't be used by 
-        **        clients.  Exposing out this functionality would allow children to overwrite
-        **        their parent's values.
+        **        ObjectManager when it's performing fixups.
         **Returns: void
         **Arguments: name  -- the name of the data to be updated.
         **           value -- the new value.
         **           type  -- the type of the data being added.
-        **Exceptions: None.  All error checking is done with asserts.
+        **Exceptions: None.  All error checking is done with asserts. Although public in coreclr,
+        **            it's not exposed in a contract and is only meant to be used by corefx.
         ==============================================================================*/
-        internal void UpdateValue(String name, Object value, Type type)
+#if FEATURE_CORECLR
+        // This should not be used by clients: exposing out this functionality would allow children
+        // to overwrite their parent's values. It is public in order to give corefx access to it for
+        // its ObjectManager implementation, but it should not be exposed out of a contract.
+        public
+#else
+        internal
+#endif
+        void UpdateValue(String name, Object value, Type type)
         {
             Contract.Assert(null != name, "[SerializationInfo.UpdateValue]name!=null");
             Contract.Assert(null != value, "[SerializationInfo.UpdateValue]value!=null");