[Решено] По работе потребовалось освоить C# (не понимаю, почему в win работает, а в lin падает)

Модератор: Модераторы разделов

Ответить
Аватара пользователя
devilr
Сообщения: 3665
ОС: Mandriva => Gentoo (~amd64)
Контактная информация:

[Решено] По работе потребовалось освоить C#

Сообщение devilr »

Есть простой код (разбор строки:

Код: Выделить всё

string jStr = "[{\"name\":\"0\",\"weight\":[1,2,3],\"count\":9}]";
 JavaScriptSerializer json = new JavaScriptSerializer();
 List<Object> objects = json.Deserialize<List<Object>>(jStr);
 System.Console.WriteLine("objects.count = " + objects.Count);
 foreach (var o in objects)
 {
         Dictionary<string, object> temp = (Dictionary<string, Object>)o;
         string name = (string)temp["name"];
         int count = (int)temp["count"];
         //Object[] weightData = (Object[])temp["weight"]; //работает в win, не работает в lin

         System.Console.WriteLine("name = " + name);
         System.Console.WriteLine("count = " + count);
 }

Если раскомметировать строку, то программа падает с System.InvalidCastException, причем только в linux. В win все работает.
Почему такое может быть?
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Эхо разума
Спасибо сказали:
Аватара пользователя
delvin-fil
Сообщения: 135
ОС: Linux → Gentoo

Re: [Решено] По работе потребовалось освоить C#

Сообщение delvin-fil »

А в линухе разве уже есть MSDN? С какого перепуга обращение с преобразованием будет работать?
import __hello__
Спасибо сказали:
Аватара пользователя
devilr
Сообщения: 3665
ОС: Mandriva => Gentoo (~amd64)
Контактная информация:

Re: [Решено] По работе потребовалось освоить C#

Сообщение devilr »

delvin-fil писал(а):
06.01.2017 18:28
А в линухе разве уже есть MSDN? С какого перепуга обращение с преобразованием будет работать?


В "линухе" есть mono (monodevelop). В котором этот код работает. Но, с проблемами. Я, как раз, постарался привести минимальный кусок кода, для демонстрации проблемы.
P.S. Да, мне c# не нравится. Но - есть работа, которую надо сделать. Поэтому, прошу помощи у сообщества - вдруг кто уже наступал на эти грабли.
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Эхо разума
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: [Решено] По работе потребовалось освоить C#

Сообщение Bizdelnick »

iУведомление от модератора
Разные вопросы обсуждаем в отдельных темах.
Как в monodevelop подключить System.Web.Extensions
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
devilr
Сообщения: 3665
ОС: Mandriva => Gentoo (~amd64)
Контактная информация:

Re: [Решено] По работе потребовалось освоить C#

Сообщение devilr »

Задача так и не решена. Неужели никто с таким не сталкивался?
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Эхо разума
Спасибо сказали:
Аватара пользователя
anonymous.ru
Сообщения: 614

Re: [Решено] По работе потребовалось освоить C#

Сообщение anonymous.ru »

devilr писал(а):
07.01.2017 20:29
Задача так и не решена. Неужели никто с таким не сталкивался?

В temp["weight"] не массив, а ArrayList
Вот так работает

Код: Выделить всё

                ArrayList ARweightData =  (ArrayList)temp["weight"];
                Object[] weightData = ARweightData.ToArray ();

:drinks:
Спасибо сказали:
Аватара пользователя
anonymous.ru
Сообщения: 614

Re: [Решено] По работе потребовалось освоить C#

Сообщение anonymous.ru »

Даже вот так

Код: Выделить всё

Object[]  weightData =  ((ArrayList)temp["weight"]).ToArray ();
:drinks:
Спасибо сказали:
Аватара пользователя
devilr
Сообщения: 3665
ОС: Mandriva => Gentoo (~amd64)
Контактная информация:

Re: [Решено] По работе потребовалось освоить C#

Сообщение devilr »

Осталось непонятным, почему в win то работает. Видимо, надо будет делать 2 варианта и разделять их как-то.
Но в целом, можно и так.
Спасибо за помощь!
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Эхо разума
Спасибо сказали:
Аватара пользователя
Vascom
Сообщения: 1699
ОС: Fedora 32

Re: [Решено] По работе потребовалось освоить C#

Сообщение Vascom »

devilr писал(а):
07.01.2017 21:43
...Видимо, надо будет делать 2 варианта и разделять их как-то.

А не лучше ли оставить один вариант, который работает везде?
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: [Решено] По работе потребовалось освоить C#

Сообщение NickLion »

Кстати, в MSDN советуют использовать Json.NET для (де)сериализации. JavaScriptSerializer не гарантирует тип для JSON массива.

Если всё же хотите использовать этот тип, то не проще ли сделать что-то вроде:

Код: Выделить всё

IEnumerable weightData = (IEnumerable)temp["weight"];
int i = 0;
foreach (Object weight in weightData) {
    System.Console.WriteLine($"weight[{i}] = {weight}");
    i++;
}

В Linux работает, по идее, в Windows тоже работать должно.
Спасибо сказали:
Аватара пользователя
devilr
Сообщения: 3665
ОС: Mandriva => Gentoo (~amd64)
Контактная информация:

Re: [Решено] По работе потребовалось освоить C#

Сообщение devilr »

Да, в windows работает. Только что проверил. Правда, с использованием IEnumerable требуется переписывать гораздо больше, чем в случае, предложенном выше (с ArrayList).
А насчет "хотите - не хотите" - мне нужно было просто проверить работу программы, чтобы в результате переписать ее на обычном c++. Проверил. Переписал.
Всем спасибо за помощь!
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Эхо разума
Спасибо сказали:
Ответить