From 1d0189d7789a24a71db1b6932f4738b0e5203a36 Mon Sep 17 00:00:00 2001 From: Egor Bogatov Date: Thu, 29 Nov 2018 10:48:59 +0300 Subject: [PATCH] [corlib] Make all Encoding types serializable (#11661) Fixes https://github.com/mono/mono/issues/11529 Fixes https://github.com/mono/mono/issues/11663 --- external/corefx | 2 +- mcs/class/corlib/Test/System.Text/EncodingTest.cs | 48 ++++++++++++++++++++++- 2 files changed, 48 insertions(+), 2 deletions(-) diff --git a/external/corefx b/external/corefx index 23522c81604..c800d031fdc 160000 --- a/external/corefx +++ b/external/corefx @@ -1 +1 @@ -Subproject commit 23522c81604a10b529069302173967bbd3fd1675 +Subproject commit c800d031fdc0ca71d460060b36fcf7817472f4e4 diff --git a/mcs/class/corlib/Test/System.Text/EncodingTest.cs b/mcs/class/corlib/Test/System.Text/EncodingTest.cs index c5b932be3b4..7f177027cc7 100644 --- a/mcs/class/corlib/Test/System.Text/EncodingTest.cs +++ b/mcs/class/corlib/Test/System.Text/EncodingTest.cs @@ -27,8 +27,10 @@ // using System; +using System.IO; using System.Text; - +using System.Linq; +using System.Runtime.Serialization.Formatters.Binary; using NUnit.Framework; namespace MonoTests.System.Text @@ -128,5 +130,49 @@ namespace MonoTests.System.Text { Assert.AreEqual ("Unicode (UTF-8)", Encoding.UTF8.EncodingName); } + + [Test] // https://github.com/mono/mono/issues/11529 + public void AllEncodingsAreSerializable () + { + foreach (var encoding in Encoding.GetEncodings ().Select(e => Encoding.GetEncoding (e.Name))) + { + var hashCode = encoding.GetHashCode (); + var serializer = new BinaryFormatter (); + using (var ms = new MemoryStream ()) + { + serializer.Serialize (ms, encoding); + ms.Position = 0; + var clone = (Encoding) serializer.Deserialize (ms); + Assert.AreEqual (encoding, clone); + } + } + } + + [Test] // https://github.com/mono/mono/issues/11663 + public void EncodingIsBinaryCompatible () + { + const string serializedEncoding = + "AAEAAAD/////AQAAAAAAAAAEAQAAABlTeXN0ZW0uVGV4dC5BU0NJSUVuY29kaW5nCQAAAAptX2NvZGVQYWdlCGRhdGFJdGVtD2VuY29kZXJGYWxsY" + + "mFjaw9kZWNvZGVyRmFsbGJhY2sTRW5jb2RpbmcrbV9jb2RlUGFnZRFFbmNvZGluZytkYXRhSXRlbRVFbmNvZGluZyttX2lzUmVhZE9ubHkYRW5jb2R" + + "pbmcrZW5jb2RlckZhbGxiYWNrGEVuY29kaW5nK2RlY29kZXJGYWxsYmFjawADAwMAAwADAwglU3lzdGVtLkdsb2JhbGl6YXRpb24uQ29kZVBhZ2VEY" + + "XRhSXRlbSZTeXN0ZW0uVGV4dC5FbmNvZGVyUmVwbGFjZW1lbnRGYWxsYmFjayZTeXN0ZW0uVGV4dC5EZWNvZGVyUmVwbGFjZW1lbnRGYWxsYmFjawg" + + "lU3lzdGVtLkdsb2JhbGl6YXRpb24uQ29kZVBhZ2VEYXRhSXRlbQEmU3lzdGVtLlRleHQuRW5jb2RlclJlcGxhY2VtZW50RmFsbGJhY2smU3lzdGVtL" + + "lRleHQuRGVjb2RlclJlcGxhY2VtZW50RmFsbGJhY2ufTgAACgkCAAAACQMAAACfTgAACgEJAgAAAAkDAAAABAIAAAAmU3lzdGVtLlRleHQuRW5jb2R" + + "lclJlcGxhY2VtZW50RmFsbGJhY2sDAAAACnN0ckRlZmF1bHQbYklzTWljcm9zb2Z0QmVzdEZpdEZhbGxiYWNrK0VuY29kZXJGYWxsYmFjaytiSXNNa" + + "WNyb3NvZnRCZXN0Rml0RmFsbGJhY2sBAAABAQYGAAAAAT8AAAQDAAAAJlN5c3RlbS5UZXh0LkRlY29kZXJSZXBsYWNlbWVudEZhbGxiYWNrAwAAAAp" + + "zdHJEZWZhdWx0G2JJc01pY3Jvc29mdEJlc3RGaXRGYWxsYmFjaytEZWNvZGVyRmFsbGJhY2srYklzTWljcm9zb2Z0QmVzdEZpdEZhbGxiYWNrAQAAA" + + "QEJBgAAAAAACw=="; + + using (var ms = new MemoryStream (Convert.FromBase64String (serializedEncoding))) + { + var serializer = new BinaryFormatter (); + var e = (Encoding) serializer.Deserialize (ms); + Assert.IsTrue (e.EncoderFallback.GetHashCode () != 0); + Assert.IsTrue (e.DecoderFallback.GetHashCode () != 0); + Assert.IsTrue (e.GetDecoder ().GetHashCode () != 0); + Assert.IsTrue (e.GetEncoder ().GetHashCode () != 0); + Assert.IsTrue (e.GetHashCode () != 0); + } + } } } -- 2.11.4.GIT