forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   С# (http://forum.boolean.name/forumdisplay.php?f=128)
-   -   System.Reflection и сериализация свойств (http://forum.boolean.name/showthread.php?t=20351)

RegIon 08.07.2016 21:44

System.Reflection и сериализация свойств
 
Вопрос вообще из Юнити, но больше из класического .net

Как мне правильно собрать все помеченные атрибутом свойства и поля в классе (компоненте go) с последующей их сериализацией/десериализацией в Json?

Это нужно для того. что бы написать кастомный редактор для объектов разного типа (аналог инспектора Юнити, ток в приложении ), по этому писать универсальный класс с параметрами не вариант.

Если есть более удобный способ, кроме рефлексии (а его нет), то я только за.
Часть тз:
Цитата:

Каждая сцена должна быть настраиваемая, пользователь должен иметь способность выбрать цвет, изображение фона или изменить какой-либо другой параметр. Количество различных сцен должно быть около 50. .... и список сцен и параметров на них
На текущий момент настругал такой класс, правда я не уверен что он будет работать.
http://pastebin.com/TqhKiqTG

PAX, хотя ты и делся куда-то, но нужна твоя помощь.

Прошу не игнорировать, ибо задачу нужно как-то решить и поскорее.

RegIon 09.07.2016 00:29

Ответ: System.Reflection и сериализация свойств
 
Как с MemberInfo получить тип?

А то если
Код:

MemberInfo.ToString()
, то выдает Type.Name Name
пример:
Код:

float t ; - > System.Sungle t
А если
Код:

MemberInfo.GetType()
, то будет
Цитата:

System.MonoType()
. и как тут быть?
Нужно как в первом варианте, что бы нормально сериализовать.

h1dd3n 09.07.2016 13:06

Ответ: System.Reflection и сериализация свойств
 
MemberInfo это информация о члене класса (как и следует из названия).
А член класса это:
- поле
- свойство
- метод
- конструктор
- событие
- вложенный тип (вложенный класс, структура, перечисление)
- что-то еще что я забыл

Так как MemberInfo это класс для всех выше перечисленных членов класса, то что ты хочешь получить от него? Какой-то "тип"? Но у конструктора нету типа. Поэтому и у класса MemberInfo нет возможности "получить тип".
Однако если у тебя задача сериализовать все поля и свойства, ты можешь у MemberInfo взять свойство MemberType (то есть проверить что текущий член класса это либо поле либо свойство). MemberTypes это перечисление. И дальше проверить - если MemberTypes.Property, то сделать
var propertyInfo = (PropertyInfo) memberInfo;
а вот уже у PropertyInfo есть информация о типе свойства propertyInfo.PropertyType
аналогично
var fieldInfo = (FieldInfo) memberInfo;

https://dotnetfiddle.net/z1IMim

А вообще странно как ты получил MemberInfo. В рефлексии есть удобные методы GetProperties() (возвращает PropertyInfo[]) и GetFields() (возвращает FieldInfo[]). Воспользовался бы ими - вообще проблемы не возникло бы.

RegIon 09.07.2016 14:02

Ответ: System.Reflection и сериализация свойств
 
Цитата:

Сообщение от h1dd3n (Сообщение 307002)
MemberInfo это информация о члене класса (как и следует из названия).
А член класса это:
- поле
- свойство
- метод
- конструктор
- событие
- вложенный тип (вложенный класс, структура, перечисление)
- что-то еще что я забыл

Так как MemberInfo это класс для всех выше перечисленных членов класса, то что ты хочешь получить от него? Какой-то "тип"? Но у конструктора нету типа. Поэтому и у класса MemberInfo нет возможности "получить тип".
Однако если у тебя задача сериализовать все поля и свойства, ты можешь у MemberInfo взять свойство MemberType (то есть проверить что текущий член класса это либо поле либо свойство). MemberTypes это перечисление. И дальше проверить - если MemberTypes.Property, то сделать
var propertyInfo = (PropertyInfo) memberInfo;
а вот уже у PropertyInfo есть информация о типе свойства propertyInfo.PropertyType
аналогично
var fieldInfo = (FieldInfo) memberInfo;

https://dotnetfiddle.net/z1IMim

А вообще странно как ты получил MemberInfo. В рефлексии есть удобные методы GetProperties() (возвращает PropertyInfo[]) и GetFields() (возвращает FieldInfo[]). Воспользовался бы ими - вообще проблемы не возникло бы.

Я делал так, но получается нужно перебирать сначало одно, потом другое, так как именно сериализоровать нужно с определенным атрибутом (EditByUser).
А так получается 1 проход.

Так и сделал.Проверял что за член и кастовал к нему.

И еще нельзя сериализировать object предварительно не приведя его к однозначному типу (.
Не канает даже;
Код:

o = (float) o;
не сериалзует такие объекты(

А так хотелось динамическую типизацию.
Просто у меня структура:
Код:

public Component instance;
            public string EditorName;
            public string name;
           
            [SerializeField]
            private object value;

            //[SerializeField]
            private MemberInfo info;

            [SerializeField]
            private string objectType;

            [SerializeField]
            private string instanceType;

И как-то нужно сериализовать value.

Кароче, я что-то кастомный сериализатор написал...

h1dd3n 09.07.2016 14:34

Ответ: System.Reflection и сериализация свойств
 
А чем ты сериализуешь то ? newtonsoft json.net ?
Какие-то очень странные у тебя проблемы

RegIon 09.07.2016 15:05

Ответ: System.Reflection и сериализация свойств
 
Цитата:

Сообщение от h1dd3n (Сообщение 307004)
А чем ты сериализуешь то ? newtonsoft json.net ?
Какие-то очень странные у тебя проблемы

Я сериализую UnityJson, который на json.net. (вру, свой напсали)
https://docs.unity3d.com/ScriptRefer...onUtility.html
Вот он упорно не сериализует не приведеные типы

Но только он умеет адекватно сериализовать объекты из UnityEngine


Часовой пояс GMT +4, время: 23:45.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot