C# project.GlobalVariables - есть ли возможность сохранять объекты, а не строки

MaxTraff

Client
Регистрация
16.06.2024
Сообщения
59
Благодарностей
26
Баллы
18
Если возможно в project.GlobalVariables или другом аналоге сохранять объекты, а не строки или только писать свою dll с данным функционалом?
 

volody00

Client
Регистрация
06.09.2016
Сообщения
929
Благодарностей
1 019
Баллы
93
Строки только. Есть же общий код, там создаёшь объекты и сохраняешь. Есть ещё project.Context

P.S. соррян, на мобиле не отображает, что это раздел зеннодроид. Так что инфа может быть для него и не совсем верная
 
Последнее редактирование:

MaxTraff

Client
Регистрация
16.06.2024
Сообщения
59
Благодарностей
26
Баллы
18
Объекты в общем коде доступны только для экземпляра текущего проекта.
project.Context можно передать только в вызов вложенных шаблонов.
Возможность пользоватся одним объектом между разными шаблонами в разных заданиях есть только через project.GlobalVariables и то в виде строк и как исключение в виде объекта для блокировки, но не объекта для данных.
 
  • Спасибо
Реакции: volody00

Dmitriy Ka

Client
Регистрация
03.05.2016
Сообщения
773
Благодарностей
517
Баллы
93
Если возможно в project.GlobalVariables или другом аналоге сохранять объекты, а не строки или только писать свою dll с данным функционалом?
Мой С# бот говорит, что в project.GlobalVariables можно сохранять объекты, но есть нюанс. На практике не пробовал.

Вот ответ:

Да, в ZennoPoster вы можете сохранять объекты C# в глобальных переменных проекта (project.GlobalVariables). Для этого вам нужно выполнить следующие шаги:

1. Создайте объект C#, который вы хотите сохранить. Например, предположим, у вас есть класс MyClass:
C#:
public class MyClass
{
    public string Name { get; set; }
    public int Age { get; set; }
}
2. Создайте экземпляр этого класса и установите его свойства:

C#:
var myObject = new MyClass();
myObject.Name = "John";
myObject.Age = 25;
3. Сохраните объект в глобальной переменной проекта:
C#:
project.GlobalVariables["myObject"] = myObject;
Теперь ваш объект myObject сохранен в глобальной переменной project.GlobalVariables под ключом "myObject". Вы можете получить доступ к этому объекту в любом месте вашего проекта, используя project.GlobalVariables["myObject"].

Обратите внимание, что при сохранении объектов C# в глобальных переменных проекта, они должны быть сериализуемыми, то есть иметь возможность быть преобразованными в строку и обратно. Если ваш объект не является сериализуемым, вам может потребоваться использовать другие методы сохранения и восстановления объектов, такие как сохранение в файл или использование базы данных.
 

MaxTraff

Client
Регистрация
16.06.2024
Сообщения
59
Благодарностей
26
Баллы
18
На взгляд есть подозрение, что данный бот выдал нерабочий код :-)

Но не суть. Наиболее важное в последнем обзаце - сериализация объектов. Это сужает область применения, т.к. зачастую смысл общего объекта как-раз в том чтобы это был один и тот же физический объект с одними и теми же ссылками/указателями, а не его пусть и как-то синхронизированная копия. Таже проблема и с передачей контекста из проекта в подпроект - там тоже, как я понял, происходит сериализация.
 
  • Спасибо
Реакции: Dmitriy Ka

Oleg1987

Client
Регистрация
11.08.2014
Сообщения
1 230
Благодарностей
786
Баллы
113
Начнем с того, что C# строго типизированный язык и поэтому создать какую либо структуру данных, позволяющую хранить объект произвольного типа - довольно проблематично.
Во - вторых в переменных проекта могут хранится только строки. Чтобы убедиться в этом - достаточно посмотреть на интерфейсы IGlobalVariables и ILocalVariables
Единственный возможный вариант - сериализовать объект в json, сохранять его в глобальную переменную, а где надо - снова преобразовывать в объект из json

Мой С# бот говорит, что в project.GlobalVariables можно сохранять объекты, но есть нюанс. На практике не пробовал.
Ну по моему тут и так видно что нейронка бред выдала
 
  • Спасибо
Реакции: Dmitriy Ka

Dmitriy Ka

Client
Регистрация
03.05.2016
Сообщения
773
Благодарностей
517
Баллы
93
Ну по моему тут и так видно что нейронка бред выдала
Проверил доку Zennoposter, действительно бред.

Оказался мой косяк, я в бота залил документацию только по ILocalVariables, но сейчас обновил доку у бота и добавил инфу по IGlobalVariables. Сейчас стал отвечать лучше, но все равно есть галлюцинации

123638
 

Sherminator

Client
Регистрация
10.09.2021
Сообщения
1 302
Благодарностей
702
Баллы
113
Если я вас правильно понял, то можно типа такого исполнить. Приведу пример.
Вот мы в общем коде создаем класс, с методом для вывода сообщения и переменной

C#:
    public class Test
    {
        IZennoPosterProjectModel project;
        public Test(IZennoPosterProjectModel project)
        {
            this.project = project;
        }

        public int znachenie{get;set;}

        public void SendMessage(string message)
        {
            project.SendInfoToLog(message);
        }
    }
Затем создали глобальную переменную, в первом кубике мы создаем экземпляр нашего класса и попутно выводим сообщение что бы убедиться что жкземпляр у нас создан, заодно присваиваем значение переменной в нашем объекте. затем делается боксинг и экземпляр класса помещается в глобальную переменную.


C#:
Test a = new Test(project);
a.SendMessage("Сообщение из кубика где мы создали экземпляр класса");
a.znachenie = 45345134; //Присвоили значение переменной
project.GlobalVariables["[email protected]","TestGlobalVariables"].Value = a;
Теперь идем во второй кубик и там мы делаем анбоксинг из глобальной переменной и опять выводим сообщение, демонстрируя что экземпляр класса у нас есть и получаем значение переменной которое мы туда поместили в первом кубике

C#:
Test result = project.GlobalVariables["[email protected]","TestGlobalVariables"].Value;
result.SendMessage("Сообщение из кубика где мы используем экземпляр класса созданный в другом кубике");
result.SendMessage(result.znachenie.ToString()); //выводим значение переменной которое присвоили в первом кубике
 
Последнее редактирование:
  • Спасибо
Реакции: volody00 и MaxTraff

MaxTraff

Client
Регистрация
16.06.2024
Сообщения
59
Благодарностей
26
Баллы
18
Да, сейчас тоже проверил на примитивных объектах - работает. Требует возможности сериализации зачем-то, но работает.

C#:
List<string> sharedList = new List<string>();
sharedList.Add("Value1");
    
project.Context["sharedList"] = sharedList;
project.GlobalVariables.SetVariable("sharedObjectNamespace", "sharedList", sharedList);

sharedList.Add("Value2");

project.SendInfoToLog("sharedList.count: " + sharedList.Count);
project.SendInfoToLog("Context[sharedList].count: " + project.Context["sharedList"].Count);
project.SendInfoToLog("GlobalVariables[sharedList].count: " + project.GlobalVariables["sharedObjectNamespace","sharedList"].Value.Count);
С динамическим объектом тоже...
C#:
dynamic sharedObject = new System.Dynamic.ExpandoObject();
sharedObject.count = 1;
    
project.Context["sharedObject"] = sharedObject;
project.GlobalVariables.SetVariable("sharedObjectNamespace", "sharedObject", sharedObject);

sharedObject.count++;

project.SendInfoToLog("sharedObject.count: " + sharedObject.count);
project.SendInfoToLog("Context[sharedObject].count: " + project.Context["sharedObject"].count);
project.SendInfoToLog("GlobalVariables[sharedObject].count: " + project.GlobalVariables["sharedObjectNamespace","sharedObject"].Value.count);
Со вложениями тоже проблемы не нашел...
C#:
Dictionary<string, object> sharedDict = new Dictionary<string, object>();
dynamic counter = new System.Dynamic.ExpandoObject();
counter.count = 1;
sharedDict.Add("counterObj", counter);
    
project.Context["sharedDict"] = sharedDict;
project.GlobalVariables.SetVariable("sharedObjectNamespace", "sharedDict", sharedDict);

counter.count++;

project.SendInfoToLog("sharedDict.count: " + ((dynamic)sharedDict["counterObj"]).count);
project.SendInfoToLog("Context[sharedDict].count: " + project.Context["sharedDict"]["counterObj"].count);
project.SendInfoToLog("GlobalVariables[sharedDict].count: " + project.GlobalVariables["sharedObjectNamespace","sharedDict"].Value["counterObj"].count);
Мистика, не понимаю, почему у меня ранее подобное не работало - да, на более сложных классах, но тут не должно быть принципиально это. Нужно еще раз при случае попробовать на реальном кейсе.
 
  • Спасибо
Реакции: volody00

Sherminator

Client
Регистрация
10.09.2021
Сообщения
1 302
Благодарностей
702
Баллы
113
Да, сейчас тоже проверил на примитивных объектах - работает. Требует возможности сериализации зачем-то, но работает.

C#:
List<string> sharedList = new List<string>();
sharedList.Add("Value1");
 
project.Context["sharedList"] = sharedList;
project.GlobalVariables.SetVariable("sharedObjectNamespace", "sharedList", sharedList);

sharedList.Add("Value2");

project.SendInfoToLog("sharedList.count: " + sharedList.Count);
project.SendInfoToLog("Context[sharedList].count: " + project.Context["sharedList"].Count);
project.SendInfoToLog("GlobalVariables[sharedList].count: " + project.GlobalVariables["sharedObjectNamespace","sharedList"].Value.Count);
С динамическим объектом тоже...
C#:
dynamic sharedObject = new System.Dynamic.ExpandoObject();
sharedObject.count = 1;
 
project.Context["sharedObject"] = sharedObject;
project.GlobalVariables.SetVariable("sharedObjectNamespace", "sharedObject", sharedObject);

sharedObject.count++;

project.SendInfoToLog("sharedObject.count: " + sharedObject.count);
project.SendInfoToLog("Context[sharedObject].count: " + project.Context["sharedObject"].count);
project.SendInfoToLog("GlobalVariables[sharedObject].count: " + project.GlobalVariables["sharedObjectNamespace","sharedObject"].Value.count);
Со вложениями тоже проблемы не нашел...
C#:
Dictionary<string, object> sharedDict = new Dictionary<string, object>();
dynamic counter = new System.Dynamic.ExpandoObject();
counter.count = 1;
sharedDict.Add("counterObj", counter);
 
project.Context["sharedDict"] = sharedDict;
project.GlobalVariables.SetVariable("sharedObjectNamespace", "sharedDict", sharedDict);

counter.count++;

project.SendInfoToLog("sharedDict.count: " + ((dynamic)sharedDict["counterObj"]).count);
project.SendInfoToLog("Context[sharedDict].count: " + project.Context["sharedDict"]["counterObj"].count);
project.SendInfoToLog("GlobalVariables[sharedDict].count: " + project.GlobalVariables["sharedObjectNamespace","sharedDict"].Value["counterObj"].count);
Мистика, не понимаю, почему у меня ранее подобное не работало - да, на более сложных классах, но тут не должно быть принципиально это. Нужно еще раз при случае попробовать на реальном кейсе.
Примитивные объекты ?) что ?)
 

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)