Бинарная сериализация в .NetCore или лыжи не едут
От: vladpol Украина http://vlad-mislitel.livejournal.com/
Дата: 01.07.19 16:52
Оценка:
Приветствую. Вот простейший пример. Приложение .NetCore 2.1
namespace BinaryFormatterTest
{
    class Program
    {
        static void Main(string[] args)
        {
            var runtimeType = new Dictionary<string, long?>{{"a",1}};

            using (var memoryStream = new System.IO.MemoryStream())
            {
                var binaryFormatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter(){Binder =  new AllowedTypesValidatorSerializationBinder()};
                binaryFormatter.Serialize(memoryStream, runtimeType);
                memoryStream.Seek(0, SeekOrigin.Begin);
                var result = (Dictionary<string, long?>)binaryFormatter.Deserialize(memoryStream);
                Console.WriteLine(result["a"]);
            }
        }
    }

    class AllowedTypesValidatorSerializationBinder : SerializationBinder
    {
        private static readonly Dictionary<string, Type> _knownTypesCache = new Dictionary<string, Type>(StringComparer.Ordinal)
        {
            { typeof(string).FullName, typeof(string)},
            {
                typeof(Dictionary<string, long?>).FullName, typeof(Dictionary<string, long?>)
            },
            {
                typeof(KeyValuePair<string, long?>).FullName, typeof(KeyValuePair<string, long?>)
            },

        };

        public override Type BindToType(string assemblyName, string typeName)
        {
            Type t = null;
            try
            {
                t = _knownTypesCache[typeName];
            }
            catch (KeyNotFoundException)
            {
                return null;

                // throw new InvalidOperationException("Validation failed, type is not allowed: " + typeName);
            }

            return t;
        }
    }
}



и вот фокус в том что в BindToType в качестве typeName приходит

System.Collections.Generic.Dictionary`2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Nullable`1[[System.Int64, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]



вместо

[System.Collections.Generic.Dictionary`2[[System.String, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[System.Nullable`1[[System.Int64, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]], System.Collections.Generic.Dictionary`2[System.String,System.Nullable`1[System.Int64]]]} System.Collections.Generic.KeyValuePair<string, System.Type>


Сначала я думал, что что-то напортачил с платформами, но пройдя по стеку я нашел приинтереснейшое место
// Decompiled with JetBrains decompiler
// Type: System.Runtime.Serialization.Formatters.Binary.Converter
// Assembly: System.Runtime.Serialization.Formatters, Version=4.0.3.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
// MVID: DE65D97E-45D3-4ECC-8EF5-5BBE1917DA67
// Assembly location: C:\Program Files\dotnet\shared\Microsoft.NETCore.App\2.1.11\System.Runtime.Serialization.Formatters.dll

using System.Globalization;
using System.Reflection;

namespace System.Runtime.Serialization.Formatters.Binary
{
  internal static class Converter
  {
    //...
    internal static readonly Assembly s_urtAssembly = Assembly.Load("mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089");
    internal static readonly string s_urtAssemblyString = Converter.s_urtAssembly.FullName;



Собственно отсюда оно и прилетает.


Ну и собственно вопросы:
1. Не верблюд ли я?
2. Если первый ответ отрицательный, то что с этим сталкивался?
3. Что делать?
С уважением, Владислав Полищук
.netcore binaryformatter issue
Re: Бинарная сериализация в .NetCore или лыжи не едут
От: Sharov Россия  
Дата: 01.07.19 17:47
Оценка:
Здравствуйте, vladpol, Вы писали:

V>3. Что делать?


Бинарная сериализация -- енто лютейшее зло, про нее лучеш вообще забыть. Иначе с версионностью намучаетесь... Во всяком случае в .net и, наверное, в core.
Кодом людям нужно помогать!
Re[2]: Бинарная сериализация в .NetCore или лыжи не едут
От: Степанов Андрей  
Дата: 01.07.19 19:07
Оценка: +1
Здравствуйте, Sharov, Вы писали:

S>Здравствуйте, vladpol, Вы писали:


V>>3. Что делать?


S>Бинарная сериализация -- енто лютейшее зло, про нее лучеш вообще забыть. Иначе с версионностью намучаетесь... Во всяком случае в .net и, наверное, в core.


Согласен. Одной из самой моих больших ошибок в разработке .NET было использование бинарной сериализации в одном из проектов. Понять, что же такое хранится, и тем более обработать без .NET программы нереально. И с версиями тоже песня та ещё. Это не то чтобы загнуло проект, но оочень сильно ему повредило. XML или JSON наше всё. В другом проекте пришлось подключать DLLки только для того, чтобы прочитать один флажок, сериализованный в бинарном виде — жесть та ещё. Не говоря уже о том, что есть замечательные атаки через бинарную сериализацию
Re[2]: Бинарная сериализация в .NetCore или лыжи не едут
От: Ночной Смотрящий Россия  
Дата: 01.07.19 20:38
Оценка: +1
Здравствуйте, Sharov, Вы писали:

S>Бинарная сериализация -- енто лютейшее зло, про нее лучеш вообще забыть.


Глупость пишешь, проблема не в бинарной сериализации, а конкретно в BinaryFormatter.
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re: Бинарная сериализация в .NetCore или лыжи не едут
От: Ночной Смотрящий Россия  
Дата: 01.07.19 20:38
Оценка: +2
Здравствуйте, vladpol, Вы писали:

V>Приветствую. Вот простейший пример. Приложение .NetCore 2.1

V> var binaryFormatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter()

Выкинуть бяку и использовать что-то более приличное: protobuf, bson, да хотя бы даже DataContractSerializer с binary encoding.
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[2]: Бинарная сериализация в .NetCore или лыжи не едут
От: Danchik Украина  
Дата: 01.07.19 20:59
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

НС>Здравствуйте, vladpol, Вы писали:


V>>Приветствую. Вот простейший пример. Приложение .NetCore 2.1

V>> var binaryFormatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter()

НС>Выкинуть бяку и использовать что-то более приличное: protobuf, bson, да хотя бы даже DataContractSerializer с binary encoding.


Ну или Microsoft Bond, они как раз и выложили его, так как используют в своей разработке.
Re[3]: Бинарная сериализация в .NetCore или лыжи не едут
От: CodeMonkey  
Дата: 06.07.19 14:43
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

НС>Глупость пишешь, проблема не в бинарной сериализации, а конкретно в BinaryFormatter.


А если еще точнее — в кривых руках и больном воображении тех, кто его писал.
Re[4]: Бинарная сериализация в .NetCore или лыжи не едут
От: Ночной Смотрящий Россия  
Дата: 06.07.19 16:24
Оценка:
Здравствуйте, CodeMonkey, Вы писали:

CM>А если еще точнее — в кривых руках и больном воображении тех, кто его писал.


BinaryFormatter не был предназначен для интероперабельности.
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[5]: Бинарная сериализация в .NetCore или лыжи не едут
От: CodeMonkey  
Дата: 07.07.19 17:20
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

НС>BinaryFormatter не был предназначен для интероперабельности.


А также скорости и экономии объема. И вообще не очень понятно, для чего он был предназначен.
Re[6]: Бинарная сериализация в .NetCore или лыжи не едут
От: Ночной Смотрящий Россия  
Дата: 07.07.19 20:41
Оценка:
Здравствуйте, CodeMonkey, Вы писали:

CM>А также скорости и экономии объема. И вообще не очень понятно, для чего он был предназначен.


Для междоменного взаимодействия.
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.