Сериализация объекта C # в JSON дает разные результаты на разных компьютерах - PullRequest
2 голосов
/ 19 марта 2019

Я ранее задавал вопрос здесь на SO об этой проблеме, но теперь я заметил, что я не слишком много исследовал эту проблему, поэтому я ошибочно заключил, что ошибка была в библиотеке JSON, которую я использовал(Newtonsoft), как указано в предыдущем вопросе.

После тестирования с использованием Microsoft. Web.Script.Serialization и решения точно такой же проблемы я считаю целесообразным задавать его как отдельный вопрос SO;так что вопрос привлечет соответствующую аудиторию с соответствующим названием.

Помимо приведенного выше разъяснения, проблема остается такой же, как и в последнем вопросе, с дополнительными подробностями ниже:

В моем приложении C #.У меня есть следующий класс c # для сериализации:

class sync_object
{
    public Dictionary<string, List<Dictionary<string, string>>> TableRecords { get; set; }
    public Dictionary<string, List<string>> ClassListWithSubjectsOffered { get; set; }
    public Dictionary<string, List<string>> ClassListWithScoreheadsOffered { get; set; }
    public List<string> ClassGroupsOrdered { get; set; }
    public List<string> SessionBoundTableRecords { get; set; }
}

После создания экземпляра sync_object и заполнения его данными, я сделал serializer.SerializeObject(instance_of_sync_object) (как я упоминал ранее, не имеет значения, если я использовалОбработчик Json JNET.NET или Miscrosoft как serializer)

Затем вывод сериализации был сохранен во временный файл (для этой отладки):

internal static void writeStringToFile(string file, string content, bool append = false)
{
    using (StreamWriter sr = new StreamWriter(file, append, Encoding.UTF8))
    {
        sr.Write(content);
        sr.Close();
    }
}

На моем ПК (кактак же, как ПК других пользователей приложения), вывод в порядке.На некоторых других компьютерах (другие пользователи моего приложения) вывод переворачивается / искажается.(Кроме того, когда я сериализую некоторые другие экземпляры класса C #, сериализованный вывод Json на этих проблемных ПК будет иметь вопросительные знаки (например, «?????????») вместо ключей Json, когда я выгрузилвывод на консоль (даже с Console.OutputEncoding = System.Text.Encoding.UTF8;, хотя он идеально подходит для моих компьютеров и других компьютеров)

Пример строки JSON, выгруженной во временный файл на моем компьютере и других компьютерах, который показал правильный вывод:

{"TableRecords":{"personal_db":[{"id":"1","pixFile":"","regNo":"CSS/1819/1","custom_school_id":"","house":"","std_name":"ADETUNMBI FUNMLADE","dob":"","pob":"","dateOfAdmission":"","classAdmitted":"BASIC1 OMOTAYO","religion":"","homeTown":"","lga":"","state":"","Nationality":"","parentName":"","parentContact":"0","parentEmail":"","siblings":"","occupation":"","positionInFamily":"","health":"","prevSchool":"","prevClassAtPreviousSchool":"","reasonForLeaving":"","currClass":"BASIC1 OMOTAYO","ssclassif":"","sex":"","dropped":"false","graduated":"false","session_admitted":"2018/2019","session_dropped":"","term_dropped":"0","session_graduated":"","date_graduated":"","sort_group":""},{"id":"2","pixFile":"","regNo":"CSS/1819/2","custom_school_id":"","house":"","std_name":"AJADI DEBORAH","dob":"","pob":"","dateOfAdmission":"","classAdmitted":"BASIC1 OMOTAYO","religion":"","homeTown":"","lga":"","state":"","Nationality":"","parentName":"","parentContact":"0","parentEmail":"","siblings":"","occupation":"","positionInFamily":"","health":"","prevSchool":"","prevClassAtPreviousSchool":"","reasonForLeaving":"","currClass":"BASIC1 OMOTAYO","ssclassif":"","sex":"","dropped":"false","graduated":"false","session_admitted":"2018/2019","session_dropped":"","term_dropped":"0","session_graduated":"","date_graduated":"","sort_group":""}],"staff_records":[],"std_class_session_data":[{"id_sessional":"1","regno_sessional":"CSS/1819/1","session":"2018/2019","class":"BASIC1 OMOTAYO","ssclassif_sessional":"","location":"","date_entered":"3/18/2019 7:49:39 AM"},{"id_sessional":"2","regno_sessional":"CSS/1819/2","session":"2018/2019","class":"BASIC1 OMOTAYO","ssclassif_sessional":"","location":"","date_entered":"3/18/2019 7:49:41 AM"}],"score_headers":[{"id":"17","name":"TEST (100 marks)","max_obtainable_score":"100","class_group":"","display_on_result":"yes","display_on_midterm_report":"no","mapped_score_header":"","is_exam":"","is_display_score_header":"","display_as":"TEST","session":"2018/2019","created_at":"2019-03-18 07:51:48"},{"id":"18","name":"EXAM (100 marks)","max_obtainable_score":"100","class_group":"","display_on_result":"yes","display_on_midterm_report":"no","mapped_score_header":"","is_exam":"","is_display_score_header":"","display_as":"EXAM","session":"2018/2019","created_at":"2019-03-18 07:51:48"}],"scores":[{"id":"1","std_id":"CSS/1819/1","term":"1","session":"2018/2019","std_class":"BASIC1 OMOTAYO","subject":"RELIGION","score_header":"TEST (100 marks)","score":"92","teacher_comment":"","date_created":"2019-03-18 07:51:48","updated_at":"2019-03-18 07:51:48"},{"id":"2","std_id":"CSS/1819/1","term":"1","session":"2018/2019","std_class":"BASIC1 OMOTAYO","subject":"RELIGION","score_header":"EXAM (100 marks)","score":"100","teacher_comment":"","date_created":"2019-03-18 07:51:48","updated_at":"2019-03-18 07:51:48"}]},"ClassListWithSubjectsOffered":{"BASIC1 MBADUGHA":["ART","BASIC SCIENCE","COMPOSITION","COMPUTER","ENGLISH","FRENCH","HEALTH EDUCATION","MATHEMATICS","MUSIC","PHONICS","QUANTITATIVE","READING","RELIGION","SOCIAL STUDIES","SPELLING","VERBAL","VOCATIONAL APTITUDE","YORUBA","ENGLISH","MATHEMATICS"],"BASIC1 OMOTAYO":["ART","BASIC SCIENCE","COMPOSITION","COMPUTER","ENGLISH","FRENCH","HEALTH EDUCATION","MATHEMATICS","MUSIC","PHONICS","QUANTITATIVE","READING","RELIGION","SOCIAL STUDIES","SPELLING","VERBAL","VOCATIONAL APTITUDE","YORUBA","ENGLISH","MATHEMATICS"],"BASIC1 SOGBESAN":["ART","BASIC SCIENCE","COMPOSITION","COMPUTER","ENGLISH","FRENCH","HEALTH EDUCATION","MATHEMATICS","MUSIC","PHONICS","QUANTITATIVE","READING","RELIGION","SOCIAL STUDIES","SPELLING","VERBAL","VOCATIONAL APTITUDE","YORUBA","ENGLISH","MATHEMATICS"]},"ClassListWithScoreheadsOffered":{"BASIC1 MBADUGHA":["EXAM (100 marks)","EXAM (20 marks)","EXAM (30 marks)","EXAM (50 marks)","TEST (100 marks)","TEST (20 marks)","TEST (30 marks)","TEST (50 marks)"],"BASIC1 OMOTAYO":["EXAM (100 marks)","EXAM (20 marks)","EXAM (30 marks)","EXAM (50 marks)","TEST (100 marks)","TEST (20 marks)","TEST (30 marks)","TEST (50 marks)"],"BASIC1 SOGBESAN":["EXAM (100 marks)","EXAM (20 marks)","EXAM (30 marks)","EXAM (50 marks)","TEST (100 marks)","TEST (20 marks)","TEST (30 marks)","TEST (50 marks)"]},"ClassGroupsOrdered":["BASIC1"],"SessionBoundTableRecords":["scores"]}

Пример строки JSON, выгруженной во временный файл с тех компьютеров с неправильным выводом:

{"‪‪‏‫‌‌‫‬‪‎​‎‭‫‍‎‌​‎‬‎‭‌‮‭​‍‭‮":{"personal_db":[{"id":"1","pixFile":"","regNo":"CSS/1819/1","custom_school_id":"","house":"","std_name":"ADETUNMBI FUNMLADE","dob":"","pob":"","dateOfAdmission":"","classAdmitted":"BASIC1 OMOTAYO","religion":"","homeTown":"","lga":"","state":"","Nationality":"","parentName":"","parentContact":"0","parentEmail":"","siblings":"","occupation":"","positionInFamily":"","health":"","prevSchool":"","prevClassAtPreviousSchool":"","reasonForLeaving":"","currClass":"BASIC1 OMOTAYO","ssclassif":"","sex":"","dropped":"false","graduated":"false","session_admitted":"2018/2019","session_dropped":"","term_dropped":"0","session_graduated":"","date_graduated":"","sort_group":""},{"id":"2","pixFile":"","regNo":"CSS/1819/2","custom_school_id":"","house":"","std_name":"AJADI DEBORAH","dob":"","pob":"","dateOfAdmission":"","classAdmitted":"BASIC1 OMOTAYO","religion":"","homeTown":"","lga":"","state":"","Nationality":"","parentName":"","parentContact":"0","parentEmail":"","siblings":"","occupation":"","positionInFamily":"","health":"","prevSchool":"","prevClassAtPreviousSchool":"","reasonForLeaving":"","currClass":"BASIC1 OMOTAYO","ssclassif":"","sex":"","dropped":"false","graduated":"false","session_admitted":"2018/2019","session_dropped":"","term_dropped":"0","session_graduated":"","date_graduated":"","sort_group":""}],"staff_records":[],"std_class_session_data":[{"id_sessional":"1","regno_sessional":"CSS/1819/1","session":"2018/2019","class":"BASIC1 OMOTAYO","ssclassif_sessional":"","location":"","date_entered":"3/18/2019 7:49:39 AM"},{"id_sessional":"2","regno_sessional":"CSS/1819/2","session":"2018/2019","class":"BASIC1 OMOTAYO","ssclassif_sessional":"","location":"","date_entered":"3/18/2019 7:49:41 AM"}],"score_headers":[{"id":"17","name":"TEST (100 marks)","max_obtainable_score":"100","class_group":"","display_on_result":"yes","display_on_midterm_report":"no","mapped_score_header":"","is_exam":"","is_display_score_header":"","display_as":"TEST","session":"2018/2019","created_at":"2019-03-18 07:51:48"},{"id":"18","name":"EXAM (100 marks)","max_obtainable_score":"100","class_group":"","display_on_result":"yes","display_on_midterm_report":"no","mapped_score_header":"","is_exam":"","is_display_score_header":"","display_as":"EXAM","session":"2018/2019","created_at":"2019-03-18 07:51:48"}],"scores":[]},"​‎‏‏‬‪‎‮‏‭‫‭‍‪‍‏‏‏​‫​‫‍‪​‫‌‮":{"BASIC1 MBADUGHA":["ART","BASIC SCIENCE","COMPOSITION","COMPUTER","ENGLISH","FRENCH","HEALTH EDUCATION","MATHEMATICS","MUSIC","PHONICS","QUANTITATIVE","READING","RELIGION","SOCIAL STUDIES","SPELLING","VERBAL","VOCATIONAL APTITUDE","YORUBA","ENGLISH","MATHEMATICS"],"BASIC1 OMOTAYO":["ART","BASIC SCIENCE","COMPOSITION","COMPUTER","ENGLISH","FRENCH","HEALTH EDUCATION","MATHEMATICS","MUSIC","PHONICS","QUANTITATIVE","READING","RELIGION","SOCIAL STUDIES","SPELLING","VERBAL","VOCATIONAL APTITUDE","YORUBA","ENGLISH","MATHEMATICS"],"BASIC1 SOGBESAN":["ART","BASIC SCIENCE","COMPOSITION","COMPUTER","ENGLISH","FRENCH","HEALTH EDUCATION","MATHEMATICS","MUSIC","PHONICS","QUANTITATIVE","READING","RELIGION","SOCIAL STUDIES","SPELLING","VERBAL","VOCATIONAL APTITUDE","YORUBA","ENGLISH","MATHEMATICS"]},"‫‌‌​‍‏‮‍‌​​‌‪‭‍‬‮‪‍‬‏‍‮":{"BASIC1 MBADUGHA":["EXAM (100 marks)","EXAM (20 marks)","EXAM (30 marks)","EXAM (50 marks)","TEST (100 marks)","TEST (20 marks)","TEST (30 marks)","TEST (50 marks)"],"BASIC1 OMOTAYO":["EXAM (100 marks)","EXAM (20 marks)","EXAM (30 marks)","EXAM (50 marks)","TEST (100 marks)","TEST (20 marks)","TEST (30 marks)","TEST (50 marks)"],"BASIC1 SOGBESAN":["EXAM (100 marks)","EXAM (20 marks)","EXAM (30 marks)","EXAM (50 marks)","TEST (100 marks)","TEST (20 marks)","TEST (30 marks)","TEST (50 marks)"]},"‏‮‮​‫‬‎‏‌‌‮‍‪‏‪‭‎​‍‌‮‌‎‮":["BASIC1"],"‫‮‍‭‪‍‎‏‍‫​‍‪​‍‍‍‪‏‌‮‪‮":["scores"]}

Вы заметили разницу ввывод: строка JSON на этих компьютерах переворачивается, и строки типа session теперь представлены как noisses, marks как skram ... и т. д.

Единственные очевидные различия между этими компьютерами иу меня есть то, что я использую 32-битный ПК с Windows 7, в то время как у них 64-битная Windows 10. Еще более запутанным является тот факт, что у меня есть другой ПК с Windows 10, на котором все работает совершенно точно так же, как мой собственный компьютер с Win 7.

РЕДАКТИРОВАТЬ:

Ссылка на папку на моем диске, содержащую дампы хорошего и плохого временных файлов JSON

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...