Туда и обратно. Тёмная сторона сериализации презентация

Содержание

Слайд 2

Слайд 3

О себе Зарабатываю на жизнь программированием с 2005 года Программировал

О себе

Зарабатываю на жизнь программированием с 2005 года
Программировал еще на .net

framework 1.0
Помню С# без Generics
Складывал объекты ArrayList
Использовал BinaryFormatter ¯\_(ツ)_/¯
Слайд 4

“ЗОЧЕМ? Есть же ?”

“ЗОЧЕМ?
Есть же <выберите свой сериализатор>?”

Слайд 5

Варианты Protocol Buffers Json Newtonsoft.Json System.Text.Json etc BinaryFormatter XmlFormatter другие

Варианты

Protocol Buffers
Json
Newtonsoft.Json
System.Text.Json
etc
BinaryFormatter
XmlFormatter
другие

Слайд 6

Причины

Причины

Слайд 7

Причины Экзотические форматы

Причины

Экзотические форматы

Слайд 8

Причины Экзотические форматы Лучшая производительность

Причины

Экзотические форматы
Лучшая производительность

Слайд 9

Причины Экзотические форматы Лучшая производительность Другие сценарии использования Reflection: Data-binding Object-object mapping Логирование: Destructing

Причины

Экзотические форматы
Лучшая производительность
Другие сценарии использования Reflection:
Data-binding
Object-object mapping
Логирование: Destructing

Слайд 10

О докладе Доступ к данным: Reflection и альтернативы Производительность различных

О докладе

Доступ к данным: Reflection и альтернативы
Производительность различных способов доступа
Участие доступа

к данным в процессе сериализации
Слайд 11

Прямой доступ vs. Reflection

Прямой доступ vs. Reflection

Слайд 12

Слайд 13

System.Reflection System.Object GetType()

System.Reflection

System.Object
GetType()

Слайд 14

System.Reflection System.Object GetType() System.Type GetProperties(...)

System.Reflection

System.Object
GetType()
System.Type
GetProperties(...)

Слайд 15

System.Reflection System.Object GetType() System.Type GetProperties(...) System.Reflection.PropertyInfo Name PropertyType GetValue/SetValue

System.Reflection

System.Object
GetType()
System.Type
GetProperties(...)
System.Reflection.PropertyInfo
Name
PropertyType
GetValue/SetValue

Слайд 16

“Все знают, что Reflection это Медленно!!!”

“Все знают, что
Reflection это Медленно!!!”

Слайд 17

Type System Overview

Type System Overview

Слайд 18

Насколько Reflection это медленно?

Насколько Reflection это медленно?

Слайд 19

Цифры

Цифры

Слайд 20

Слайд 21

Слайд 22

Слайд 23

Слайд 24

Слайд 25

Слайд 26

Слайд 27

Слайд 28

Ba Dum Tss!

Ba Dum Tss!

Слайд 29

Ba Dum Tss!

Ba Dum Tss!

Слайд 30

“Давай закэшируем PropertyInfo!”

“Давай закэшируем PropertyInfo!”

Слайд 31

Слайд 32

Cached PropertyInfo

Cached PropertyInfo

Слайд 33

Cached PropertyInfo

Cached PropertyInfo

Слайд 34

Слайд 35

“Неужели нет другого способа?!”

“Неужели нет другого способа?!”

Слайд 36

Слайд 37

FastMember

FastMember

Слайд 38

FastMember

FastMember

Слайд 39

FastMember

FastMember

Слайд 40

Слайд 41

Слайд 42

“Безнадёга?”

“Безнадёга?”

Слайд 43

Delegate.CreateDelegate

Delegate.CreateDelegate

Слайд 44

Delegate Открытые / Закрытые

Delegate

Открытые / Закрытые

Слайд 45

Delegate: открытые/закрытые

Delegate: открытые/закрытые

Слайд 46

Delegate: открытые/закрытые

Delegate: открытые/закрытые

Слайд 47

Delegate: открытые/закрытые

Delegate: открытые/закрытые

Слайд 48

Delegate.CreateDelegate

Delegate.CreateDelegate

Слайд 49

Delegate.CreateDelegate

Delegate.CreateDelegate

Слайд 50

PropertyInfo ➝ MethodInfo

PropertyInfo ➝ MethodInfo

Слайд 51

PropertyInfo ➝ MethodInfo GetGetMethod() / GetSetMethod()

PropertyInfo ➝ MethodInfo

GetGetMethod() / GetSetMethod()

Слайд 52

Delegate.CreateDelegate

Delegate.CreateDelegate

Слайд 53

Delegate.CreateDelegate

Delegate.CreateDelegate

Слайд 54

Delegate.CreateDelegate

Delegate.CreateDelegate

Слайд 55

Delegate.CreateDelegate

Delegate.CreateDelegate

Слайд 56

Delegate.CreateDelegate

Delegate.CreateDelegate

Слайд 57

Delegate.CreateDelegate

Delegate.CreateDelegate

Слайд 58

Слайд 59

Слайд 60

“А может генерировать код в runtime?”

“А может генерировать код в runtime?”

Слайд 61

Генерация кода в runtime

Генерация кода в runtime

Слайд 62

Генерация кода в runtime IL Emit

Генерация кода в runtime

IL Emit

Слайд 63

Генерация кода в runtime IL Emit Compiled Expression Trees

Генерация кода в runtime

IL Emit
Compiled Expression Trees

Слайд 64

IL Emit

IL Emit

Слайд 65

Intermediate Language

Intermediate Language

Слайд 66

Слайд 67

public string GetViaProperty() => _test.StringProperty;

public string GetViaProperty() => _test.StringProperty;

Слайд 68

.method private hidebysig static string GetViaProperty( class Test target) cil

.method private hidebysig
static string GetViaProperty( class Test target)
cil managed
{

.maxstack 1
ldarg.0
callvirt instance string Test::get_StringProperty()
ret
}

public string GetViaProperty() => _test.StringProperty;

Слайд 69

public static Func GenerateGetter (PropertyInfo property) { var method =

public static Func GenerateGetter(PropertyInfo property)
{
var method = new DynamicMethod(property.Name

+ "GetterTyped", typeof(TParam),
new[] { typeof(TTarget) },
Module, true);
var gen = method.GetILGenerator();
var getMethod = property.GetGetMethod(true);
gen.Emit(OpCodes.Ldarg_0);
gen.Emit(OpCodes.Call, getMethod);
gen.Emit(OpCodes.Ret);
return (Func)method.CreateDelegate(typeof(Func));
}
Слайд 70

public static Func GenerateGetter (PropertyInfo property) { var method =

public static Func GenerateGetter(PropertyInfo property)
{
var method = new DynamicMethod(property.Name

+ "GetterTyped", typeof(TParam),
new[] { typeof(TTarget) },
Module, true);
var gen = method.GetILGenerator();
var getMethod = property.GetGetMethod(true);
gen.Emit(OpCodes.Ldarg_0);
gen.Emit(OpCodes.Call, getMethod);
gen.Emit(OpCodes.Ret);
return (Func)method.CreateDelegate(typeof(Func));
}
Слайд 71

public static Func GenerateGetter (PropertyInfo property) { var method =

public static Func GenerateGetter(PropertyInfo property)
{
var method = new DynamicMethod(property.Name

+ "GetterTyped", typeof(TParam),
new[] { typeof(TTarget) },
Module, true);
var gen = method.GetILGenerator();
var getMethod = property.GetGetMethod(true);
gen.Emit(OpCodes.Ldarg_0);
gen.Emit(OpCodes.Call, getMethod);
gen.Emit(OpCodes.Ret);
return (Func)method.CreateDelegate(typeof(Func));
}
Слайд 72

public static Func GenerateGetter (PropertyInfo property) { var method =

public static Func GenerateGetter(PropertyInfo property)
{
var method = new DynamicMethod(property.Name

+ "GetterTyped", typeof(TParam),
new[] { typeof(TTarget) },
Module, true);
var gen = method.GetILGenerator();
var getMethod = property.GetGetMethod(true);
gen.Emit(OpCodes.Ldarg_0);
gen.Emit(OpCodes.Call, getMethod);
gen.Emit(OpCodes.Ret);
return (Func)method.CreateDelegate(typeof(Func));
}
Слайд 73

public static Func GenerateGetter (PropertyInfo property) { var method =

public static Func GenerateGetter(PropertyInfo property)
{
var method = new DynamicMethod(property.Name

+ "GetterTyped", typeof(TParam),
new[] { typeof(TTarget) },
Module, true);
var gen = method.GetILGenerator();
var getMethod = property.GetGetMethod(true);
gen.Emit(OpCodes.Ldarg_0);
gen.Emit(OpCodes.Call, getMethod);
gen.Emit(OpCodes.Ret);
return (Func)method.CreateDelegate(typeof(Func));
}
Слайд 74

public static Func GenerateGetter (PropertyInfo property) { var method =

public static Func GenerateGetter(PropertyInfo property)
{
var method = new DynamicMethod(property.Name

+ "GetterTyped", typeof(TParam),
new[] { typeof(TTarget) },
Module, true);
var gen = method.GetILGenerator();
var getMethod = property.GetGetMethod();
gen.Emit(OpCodes.Ldarg_0);
gen.Emit(OpCodes.Call, getMethod);
gen.Emit(OpCodes.Ret);
return (Func)method.CreateDelegate(typeof(Func));
}
Слайд 75

public static Func GenerateGetter (PropertyInfo property) { var method =

public static Func GenerateGetter(PropertyInfo property)
{
var method = new DynamicMethod(property.Name

+ "GetterTyped", typeof(TParam),
new[] { typeof(TTarget) },
Module, true);
var gen = method.GetILGenerator();
var getMethod = property.GetGetMethod();
gen.Emit(OpCodes.Ldarg_0);
gen.Emit(OpCodes.Call, getMethod);
gen.Emit(OpCodes.Ret);
return (Func)method.CreateDelegate(typeof(Func));
}
Слайд 76

public static Func GenerateGetter (PropertyInfo property) { var method =

public static Func GenerateGetter(PropertyInfo property)
{
var method = new DynamicMethod(property.Name

+ "GetterTyped", typeof(TParam),
new[] { typeof(TTarget) },
Module, true);
var gen = method.GetILGenerator();
var getMethod = property.GetGetMethod();
gen.Emit(OpCodes.Ldarg_0);
gen.Emit(OpCodes.Call, getMethod);
gen.Emit(OpCodes.Ret);
return (Func)method.CreateDelegate(typeof(Func));
}
Слайд 77

public static Func GenerateGetter (PropertyInfo property) { var method =

public static Func GenerateGetter(PropertyInfo property)
{
var method = new DynamicMethod(property.Name

+ "GetterTyped", typeof(TParam),
new[] { typeof(TTarget) },
Module, true);
var gen = method.GetILGenerator();
var getMethod = property.GetGetMethod();
gen.Emit(OpCodes.Ldarg_0);
gen.Emit(OpCodes.Call, getMethod);
gen.Emit(OpCodes.Ret);
return (Func)method.CreateDelegate(typeof(Func));
}
Слайд 78

public static Func GenerateGetter (PropertyInfo property) { var method =

public static Func GenerateGetter(PropertyInfo property)
{
var method = new DynamicMethod(property.Name

+ "GetterTyped", typeof(TParam),
new[] { typeof(TTarget) },
Module, true);
var gen = method.GetILGenerator();
var getMethod = property.GetGetMethod();
gen.Emit(OpCodes.Ldarg_0);
gen.Emit(OpCodes.Call, getMethod);
gen.Emit(OpCodes.Ret);
return (Func)method.CreateDelegate(typeof(Func));
}
Слайд 79

public static Func GenerateGetter (PropertyInfo property) { var method =

public static Func GenerateGetter(PropertyInfo property)
{
var method = new DynamicMethod(property.Name

+ "GetterTyped", typeof(TParam),
new[] { typeof(TTarget) },
Module, true);
var gen = method.GetILGenerator();
var getMethod = property.GetGetMethod();
gen.Emit(OpCodes.Ldarg_0);
gen.Emit(OpCodes.Call, getMethod);
gen.Emit(OpCodes.Ret);
return (Func)method.CreateDelegate(typeof(Func));
}
Слайд 80

static Action GenerateSetter (PropertyInfo propertyInfo) { var method = new

static Action GenerateSetter(PropertyInfo propertyInfo)
{
var method = new DynamicMethod(propertyInfo.Name +

"SetterTyped", null,
new[] { typeof(TTarget), typeof(TParam) }, Module, true);
var gen = method.GetILGenerator();
var setMethod = propertyInfo.GetSetMethod();
gen.Emit(OpCodes.Ldarg_0);
gen.Emit(OpCodes.Ldarg_1);
gen.Emit(OpCodes.Call, setMethod);
gen.Emit(OpCodes.Ret);
return (Action)method.CreateDelegate(typeof(Action));
}
Слайд 81

static Action GenerateSetter (PropertyInfo propertyInfo) { var method = new

static Action GenerateSetter(PropertyInfo propertyInfo)
{
var method = new DynamicMethod(propertyInfo.Name +

"SetterTyped", null,
new[] { typeof(TTarget), typeof(TParam) }, Module, true);
var gen = method.GetILGenerator();
var setMethod = propertyInfo.GetSetMethod();
gen.Emit(OpCodes.Ldarg_0);
gen.Emit(OpCodes.Ldarg_1);
gen.Emit(OpCodes.Call, setMethod);
gen.Emit(OpCodes.Ret);
return (Action)method.CreateDelegate(typeof(Action));
}
Слайд 82

static Action GenerateSetter (PropertyInfo propertyInfo) { var method = new

static Action GenerateSetter(PropertyInfo propertyInfo)
{
var method = new DynamicMethod(propertyInfo.Name +

"SetterTyped", null,
new[] { typeof(TTarget), typeof(TParam) }, Module, true);
var gen = method.GetILGenerator();
var setMethod = propertyInfo.GetSetMethod();
gen.Emit(OpCodes.Ldarg_0);
gen.Emit(OpCodes.Ldarg_1);
gen.Emit(OpCodes.Call, setMethod);
gen.Emit(OpCodes.Ret);
return (Action)method.CreateDelegate(typeof(Action));
}
Слайд 83

static Action GenerateSetter (PropertyInfo propertyInfo) { var method = new

static Action GenerateSetter(PropertyInfo propertyInfo)
{
var method = new DynamicMethod(propertyInfo.Name +

"SetterTyped", null,
new[] { typeof(TTarget), typeof(TParam) }, Module, true);
var gen = method.GetILGenerator();
var setMethod = propertyInfo.GetSetMethod();
gen.Emit(OpCodes.Ldarg_0);
gen.Emit(OpCodes.Ldarg_1);
gen.Emit(OpCodes.Call, setMethod);
gen.Emit(OpCodes.Ret);
return (Action)method.CreateDelegate(typeof(Action));
}
Слайд 84

static Action GenerateSetter (PropertyInfo propertyInfo) { var method = new

static Action GenerateSetter(PropertyInfo propertyInfo)
{
var method = new DynamicMethod(propertyInfo.Name +

"SetterTyped", null,
new[] { typeof(TTarget), typeof(TParam) }, Module, true);
var gen = method.GetILGenerator();
var setMethod = propertyInfo.GetSetMethod();
gen.Emit(OpCodes.Ldarg_0);
gen.Emit(OpCodes.Ldarg_1);
gen.Emit(OpCodes.Call, setMethod);
gen.Emit(OpCodes.Ret);
return (Action)method.CreateDelegate(typeof(Action));
}
Слайд 85

static Action GenerateSetter (PropertyInfo propertyInfo) { var method = new

static Action GenerateSetter(PropertyInfo propertyInfo)
{
var method = new DynamicMethod(propertyInfo.Name +

"SetterTyped", null,
new[] { typeof(TTarget), typeof(TParam) }, Module, true);
var gen = method.GetILGenerator();
var setMethod = propertyInfo.GetSetMethod();
gen.Emit(OpCodes.Ldarg_0);
gen.Emit(OpCodes.Ldarg_1);
gen.Emit(OpCodes.Call, setMethod);
gen.Emit(OpCodes.Ret);
return (Action)method.CreateDelegate(typeof(Action));
}
Слайд 86

static Action GenerateSetter (PropertyInfo propertyInfo) { var method = new

static Action GenerateSetter(PropertyInfo propertyInfo)
{
var method = new DynamicMethod(propertyInfo.Name +

"SetterTyped", null,
new[] { typeof(TTarget), typeof(TParam) }, Module, true);
var gen = method.GetILGenerator();
var setMethod = propertyInfo.GetSetMethod();
gen.Emit(OpCodes.Ldarg_0);
gen.Emit(OpCodes.Ldarg_1);
gen.Emit(OpCodes.Call, setMethod);
gen.Emit(OpCodes.Ret);
return (Action)method.CreateDelegate(typeof(Action));
}
Слайд 87

static Action GenerateSetter (PropertyInfo propertyInfo) { var method = new

static Action GenerateSetter(PropertyInfo propertyInfo)
{
var method = new DynamicMethod(propertyInfo.Name +

"SetterTyped", null,
new[] { typeof(TTarget), typeof(TParam) }, Module, true);
var gen = method.GetILGenerator();
var setMethod = propertyInfo.GetSetMethod();
gen.Emit(OpCodes.Ldarg_0);
gen.Emit(OpCodes.Ldarg_1);
gen.Emit(OpCodes.Call, setMethod);
gen.Emit(OpCodes.Ret);
return (Action)method.CreateDelegate(typeof(Action));
}
Слайд 88

static Action GenerateSetter (PropertyInfo propertyInfo) { var method = new

static Action GenerateSetter(PropertyInfo propertyInfo)
{
var method = new DynamicMethod(propertyInfo.Name +

"SetterTyped", null,
new[] { typeof(TTarget), typeof(TParam) }, Module, true);
var gen = method.GetILGenerator();
var setMethod = propertyInfo.GetSetMethod();
gen.Emit(OpCodes.Ldarg_0);
gen.Emit(OpCodes.Ldarg_1);
gen.Emit(OpCodes.Call, setMethod);
gen.Emit(OpCodes.Ret);
return (Action)method.CreateDelegate(typeof(Action));
}
Слайд 89

static Action GenerateSetter (PropertyInfo propertyInfo) { var method = new

static Action GenerateSetter(PropertyInfo propertyInfo)
{
var method = new DynamicMethod(propertyInfo.Name +

"SetterTyped", null,
new[] { typeof(TTarget), typeof(TParam) }, Module, true);
var gen = method.GetILGenerator();
var setMethod = propertyInfo.GetSetMethod();
gen.Emit(OpCodes.Ldarg_0);
gen.Emit(OpCodes.Ldarg_1);
gen.Emit(OpCodes.Call, setMethod);
gen.Emit(OpCodes.Ret);
return (Action)method.CreateDelegate(typeof(Action));
}
Слайд 90

static Action GenerateSetter (PropertyInfo propertyInfo) { var method = new

static Action GenerateSetter(PropertyInfo propertyInfo)
{
var method = new DynamicMethod(propertyInfo.Name +

"SetterTyped", null,
new[] { typeof(TTarget), typeof(TParam) }, Module, true);
var gen = method.GetILGenerator();
var setMethod = propertyInfo.GetSetMethod();
gen.Emit(OpCodes.Ldarg_0);
gen.Emit(OpCodes.Ldarg_1);
gen.Emit(OpCodes.Call, setMethod);
gen.Emit(OpCodes.Ret);
return (Action)method.CreateDelegate(typeof(Action));
}
Слайд 91

Intermediate Language

Intermediate Language

Слайд 92

Intermediate Language

Intermediate Language

Слайд 93

Intermediate Language

Intermediate Language

Слайд 94

Compiled Expression Trees

Compiled Expression Trees

Слайд 95

Expression Trees

Expression Trees

Слайд 96

Expression Trees Lambda Expressions

Expression Trees

Lambda Expressions

Слайд 97

Expression Trees Lambda Expressions API

Expression Trees

Lambda Expressions
API

Слайд 98

Expression Trees: Lambda

Expression Trees: Lambda

Слайд 99

Expression Trees: Lambda

Expression Trees: Lambda

Слайд 100

Expression Trees: API

Expression Trees: API

Слайд 101

Слайд 102

Слайд 103

Слайд 104

Слайд 105

Слайд 106

Слайд 107

Слайд 108

Слайд 109

Слайд 110

Слайд 111

Слайд 112

Слайд 113

Слайд 114

Слайд 115

Expression Trees: API

Expression Trees: API

Слайд 116

Expression Trees: API

Expression Trees: API

Слайд 117

Expression Trees: API

Expression Trees: API

Слайд 118

Expression Trees: API

Expression Trees: API

Слайд 119

Слайд 120

Слайд 121

Ни рефлексией единой Reflection - медленно

Ни рефлексией единой

Reflection - медленно

Слайд 122

Ни рефлексией единой Reflection - медленно Альтернативы “из коробки” - быстрее

Ни рефлексией единой

Reflection - медленно
Альтернативы “из коробки” - быстрее

Слайд 123

Ни рефлексией единой Reflection - медленно Альтернативы “из коробки” - быстрее Требуют усилий

Ни рефлексией единой

Reflection - медленно
Альтернативы “из коробки” - быстрее
Требуют усилий

Слайд 124

“Погоди! Но ...”

“Погоди! Но ...”

Слайд 125

“Делегаты специфицированы конкретными типами целевого объекта и его свойства!”

“Делегаты специфицированы конкретными типами целевого объекта и его свойства!”

Слайд 126

Слайд 127

Слайд 128

Слайд 129

PropertyInfo.GetValue

PropertyInfo.GetValue

Слайд 130

Delegate.CreateDelegate

Delegate.CreateDelegate

Слайд 131

Delegate.CreateDelegate

Delegate.CreateDelegate

Слайд 132

System.ArgumentException Cannot bind to the target method because its signature

System.ArgumentException

Cannot bind to the target method because its signature is not

compatible with that of the delegate type.
at System.Delegate.CreateDelegate(Type type, MethodInfo method, Boolean throwOnBindFailure)
at System.Delegate.CreateDelegate(Type type, MethodInfo method)
at Program.Main() in Program.cs
Слайд 133

“Эх! А счастье было так близко...”

“Эх! А счастье было так близко...”

Слайд 134

Delegate (object, object)

Delegate (object, object)

Слайд 135

Delegate (object, object)

Delegate (object, object)

Слайд 136

Delegate (object, object)

Delegate (object, object)

Слайд 137

Delegate (object, object)

Delegate (object, object)

Слайд 138

Delegate (object, object)

Delegate (object, object)

Слайд 139

Delegate (object, object)

Delegate (object, object)

Слайд 140

Delegate (object, object)

Delegate (object, object)

Слайд 141

Delegate (object, object)

Delegate (object, object)

Слайд 142

Delegate (object, object)

Delegate (object, object)

Слайд 143

Слайд 144

Delegate (object, object)

Delegate (object, object)

Слайд 145

Delegate (object, object)

Delegate (object, object)

Слайд 146

ILGen (object, object)

ILGen (object, object)

Слайд 147

ILGen (object, object)

ILGen (object, object)

Слайд 148

ILGen (object, object)

ILGen (object, object)

Слайд 149

ILGen (object, object)

ILGen (object, object)

Слайд 150

ILGen (object, object)

ILGen (object, object)

Слайд 151

ILGen (object, object)

ILGen (object, object)

Слайд 152

Expression Trees (object, object)

Expression Trees (object, object)

Слайд 153

Expression Trees (object, object)

Expression Trees (object, object)

Слайд 154

Expression Trees (object, object)

Expression Trees (object, object)

Слайд 155

Expression Trees (object, object)

Expression Trees (object, object)

Слайд 156

Expression Trees (object, object)

Expression Trees (object, object)

Слайд 157

Слайд 158

Слайд 159

Ни рефлексией единой Reflection - медленно

Ни рефлексией единой

Reflection - медленно

Слайд 160

Ни рефлексией единой Reflection - медленно Нетипизированный доступ

Ни рефлексией единой

Reflection - медленно
Нетипизированный доступ

Слайд 161

Ни рефлексией единой Reflection - медленно Нетипизированный доступ Альтернативы “из коробки” - быстрее

Ни рефлексией единой

Reflection - медленно
Нетипизированный доступ
Альтернативы “из коробки” - быстрее

Слайд 162

Ни рефлексией единой Reflection - медленно Нетипизированный доступ Альтернативы “из коробки” - быстрее Типизированный доступ

Ни рефлексией единой

Reflection - медленно
Нетипизированный доступ
Альтернативы “из коробки” - быстрее
Типизированный доступ

Слайд 163

Ни рефлексией единой Reflection - медленно Нетипизированный доступ Альтернативы “из коробки” - быстрее Типизированный доступ Reflection-like

Ни рефлексией единой

Reflection - медленно
Нетипизированный доступ
Альтернативы “из коробки” - быстрее
Типизированный доступ
Reflection-like

Слайд 164

Ни рефлексией единой Reflection - медленно Нетипизированный доступ Альтернативы “из

Ни рефлексией единой

Reflection - медленно
Нетипизированный доступ
Альтернативы “из коробки” - быстрее
Типизированный доступ
Reflection-like
Требуют

усилий
Слайд 165

“А что если ValueType? Boxing же!”

“А что если ValueType? Boxing же!”

Слайд 166

ValueType

ValueType

Слайд 167

ValueType

ValueType

Слайд 168

ValueType

ValueType

Слайд 169

Слайд 170

Слайд 171

Слайд 172

Ни рефлексией единой: Value Type

Ни рефлексией единой: Value Type

Слайд 173

Ни рефлексией единой: Value Type Reflection: boxing

Ни рефлексией единой: Value Type

Reflection: boxing

Слайд 174

Ни рефлексией единой: Value Type Reflection: boxing Альтернатива Reflection-like: boxing

Ни рефлексией единой: Value Type

Reflection: boxing
Альтернатива
Reflection-like: boxing

Слайд 175

Ни рефлексией единой: Value Type Reflection: boxing Альтернатива Reflection-like: boxing Типизированный доступ: no boxing

Ни рефлексией единой: Value Type

Reflection: boxing
Альтернатива
Reflection-like: boxing
Типизированный доступ: no boxing

Слайд 176

Приватные данные

Приватные данные

Слайд 177

Слайд 178

Слайд 179

Слайд 180

Слайд 181

Доступ к данным

Доступ к данным

Слайд 182

Доступ к данным Reflection

Доступ к данным

Reflection

Слайд 183

Доступ к данным Reflection: Медленно

Доступ к данным

Reflection:
Медленно

Слайд 184

Доступ к данным Reflection: Медленно Boxing

Доступ к данным

Reflection:
Медленно
Boxing

Слайд 185

Доступ к данным Reflection: Медленно Boxing Альтернативы

Доступ к данным

Reflection:
Медленно
Boxing
Альтернативы

Слайд 186

Доступ к данным Reflection: Медленно Boxing Альтернативы: Сильно быстрее Reflection

Доступ к данным

Reflection:
Медленно
Boxing
Альтернативы:
Сильно быстрее Reflection

Слайд 187

Доступ к данным Reflection: Медленно Boxing Альтернативы: Сильно быстрее Reflection Boxing

Доступ к данным

Reflection:
Медленно
Boxing
Альтернативы:
Сильно быстрее Reflection
Boxing

Слайд 188

Доступ к данным Reflection: Медленно Boxing Альтернативы: Сильно быстрее Reflection Boxing / No Boxing

Доступ к данным

Reflection:
Медленно
Boxing
Альтернативы:
Сильно быстрее Reflection
Boxing / No Boxing

Слайд 189

Доступ к данным Reflection: Медленно Boxing Альтернативы: Сильно быстрее Reflection

Доступ к данным

Reflection:
Медленно
Boxing
Альтернативы:
Сильно быстрее Reflection
Boxing / No Boxing
Можно и приватные

данные (поля, свойства)
Слайд 190

Доступ к данным Reflection: Медленно Boxing Альтернативы: Сильно быстрее Reflection

Доступ к данным

Reflection:
Медленно
Boxing
Альтернативы:
Сильно быстрее Reflection
Boxing / No Boxing
Можно и приватные

данные (поля, свойства)
Прямое чтение/запись не обойти
Слайд 191

Слайд 192

Сценарий использования

Сценарий использования

Слайд 193

Сериализация

Сериализация

Слайд 194

Сериализация

Сериализация

Слайд 195

Сериализация

Сериализация

Слайд 196

Сериализация

Сериализация

Слайд 197

Сериализация

Сериализация

Слайд 198

Сериализация

Сериализация

Слайд 199

Но!

Но!

Слайд 200

Сгенерированный сериализатор

Сгенерированный сериализатор

Слайд 201

Сгенерированный сериализатор

Сгенерированный сериализатор

Слайд 202

Сериализация

Сериализация

Слайд 203

Слайд 204

Слайд 205

Слайд 206

Слайд 207

ValueType. Reflection-like

ValueType. Reflection-like

Слайд 208

ValueType. Generated

ValueType. Generated

Слайд 209

Слайд 210

Слайд 211

Слайд 212

Слайд 213

Слайд 214

Слайд 215

Ни рефлексией единой BinaryFormatter Newtonsoft.Json System.Text.Json Google.Protobuf AutoMapper

Ни рефлексией единой

BinaryFormatter
Newtonsoft.Json
System.Text.Json
Google.Protobuf
AutoMapper

Слайд 216

Ни рефлексией единой BinaryFormatter: Reflection Newtonsoft.Json System.Text.Json Google.Protobuf AutoMapper

Ни рефлексией единой

BinaryFormatter: Reflection
Newtonsoft.Json
System.Text.Json
Google.Protobuf
AutoMapper

Слайд 217

Ни рефлексией единой BinaryFormatter: Reflection ¯\_(ツ)_/¯ Newtonsoft.Json System.Text.Json Google.Protobuf AutoMapper

Ни рефлексией единой

BinaryFormatter: Reflection ¯\_(ツ)_/¯
Newtonsoft.Json
System.Text.Json
Google.Protobuf
AutoMapper

Слайд 218

Ни рефлексией единой BinaryFormatter: Reflection Newtonsoft.Json: IL Emit System.Text.Json Google.Protobuf AutoMapper

Ни рефлексией единой

BinaryFormatter: Reflection
Newtonsoft.Json: IL Emit
System.Text.Json
Google.Protobuf
AutoMapper

Слайд 219

Ни рефлексией единой BinaryFormatter: Reflection Newtonsoft.Json: IL Emit System.Text.Json: IL Emit Google.Protobuf AutoMapper

Ни рефлексией единой

BinaryFormatter: Reflection
Newtonsoft.Json: IL Emit
System.Text.Json: IL Emit
Google.Protobuf
AutoMapper

Слайд 220

Ни рефлексией единой BinaryFormatter: Reflection Newtonsoft.Json: IL Emit System.Text.Json: IL Emit Google.Protobuf: Property AutoMapper

Ни рефлексией единой

BinaryFormatter: Reflection
Newtonsoft.Json: IL Emit
System.Text.Json: IL Emit
Google.Protobuf: Property
AutoMapper

Слайд 221

Ни рефлексией единой BinaryFormatter: Reflection Newtonsoft.Json: IL Emit System.Text.Json: IL

Ни рефлексией единой

BinaryFormatter: Reflection
Newtonsoft.Json: IL Emit
System.Text.Json: IL Emit
Google.Protobuf: Property (Генерация C#

- кода)
AutoMapper
Слайд 222

Ни рефлексией единой BinaryFormatter: Reflection Newtonsoft.Json: IL Emit System.Text.Json: IL

Ни рефлексией единой

BinaryFormatter: Reflection
Newtonsoft.Json: IL Emit
System.Text.Json: IL Emit
Google.Protobuf: Property (Генерация C#

- кода)
AutoMapper: Expression Trees
Слайд 223

Осталось за скобками Безопасность Инстанцирование объектов (new, CreateInstance) Парсинг данных

Осталось за скобками

Безопасность
Инстанцирование объектов (new, CreateInstance)
Парсинг данных
Схема и версионирование данных
Генерация C#

- кода
Слайд 224

Ни рефлексией единой Reflection - медленно Есть достойные альтернативы: CreateDelegate

Ни рефлексией единой

Reflection - медленно
Есть достойные альтернативы:
CreateDelegate / IL Emit /

Expression Trees
Доступ к данным еще не всё
Runtime генерация кода для “сложных” случаев
Слайд 225

Имя файла: Туда-и-обратно.-Тёмная-сторона-сериализации.pptx
Количество просмотров: 85
Количество скачиваний: 0