BinaryFormatter. Deserialize оставляет некоторые значения как Byte [] - PullRequest
0 голосов
/ 22 мая 2019

РЕДАКТИРОВАТЬ: я не контролирую сериализацию, поэтому использование json не вариант.

Я использую BinaryFormatter для десериализации Dictionary<string, object>.Простое представление словаря:

{
    "correlation_id": "7233bdc9-56d2-4f7a-96cf-14bb1d62ea82",
    "error": {
        "code": "openaccess.authentication.invalidinternallogin",
        "message": "The username/password combination you have entered is incorrect. Please make sure your username is correct and then retype your password."
        },
    "method": "add_authentication",
    "version": "1.0",
    "business_event_class": "Unknown"
}

Единственная пара ключ-значение, которая правильно десериализована, является последней ("business_event_class"), поскольку обе стороны переводятся в строку.Во всех остальных случаях, включая вложенный словарь ("error"), ключи переводятся в строку, но значения остаются в виде байта [].

Мой код:

var mStream = new MemoryStream();
var binFormatter = new BinaryFormatter();
mStream.Write(binDict, 0, binDict.Length);  //binDict is the serialized dict
mStream.Position = 0;
var responseDict = binFormatter.Deserialize(mStream) as Dictionary<string, object>;

Кодированный (base64)) словарь объекта:

AAEAAAD/////AQAAAAAAAAAEAQAAAOIBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuRGljdGlvbmFyeWAyW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uT2JqZWN0LCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQQAAAAHVmVyc2lvbghDb21wYXJlcghIYXNoU2l6ZQ1LZXlWYWx1ZVBhaXJzAAMAAwiSAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkdlbmVyaWNFcXVhbGl0eUNvbXBhcmVyYDFbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dCOYBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuS2V5VmFsdWVQYWlyYDJbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5PYmplY3QsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dW10FAAAACQIAAAAHAAAACQMAAAAEAgAAAJIBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuR2VuZXJpY0VxdWFsaXR5Q29tcGFyZXJgMVtbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0AAAAABwMAAAAAAQAAAAUAAAAD5AFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5LZXlWYWx1ZVBhaXJgMltbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLk9iamVjdCwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0E/P///+QBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuS2V5VmFsdWVQYWlyYDJbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5PYmplY3QsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAgAAAANrZXkFdmFsdWUBAgYFAAAADmNvcnJlbGF0aW9uX2lkCQYAAAAB+f////z///8GCAAAAAVlcnJvcgkJAAAAAfb////8////BgsAAAAGbWV0aG9kCQwAAAAB8/////z///8GDgAAAAd2ZXJzaW9uCQ8AAAAB8P////z///8GEQAAABRidXNpbmVzc19ldmVudF9jbGFzcwYSAAAAB1Vua25vd24PBgAAACQAAAACNzIzM2JkYzktNTZkMi00ZjdhLTk2Y2YtMTRiYjFkNjJlYTgyAQkAAAABAAAAAgAAAAkCAAAAAwAAAAkUAAAADwwAAAASAAAAAmFkZF9hdXRoZW50aWNhdGlvbg8PAAAAAwAAAAIxLjAHFAAAAAABAAAAAgAAAAPkAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLktleVZhbHVlUGFpcmAyW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uT2JqZWN0LCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQHr/////P///wYWAAAABGNvZGUJFwAAAAHo/////P///wYZAAAAB21lc3NhZ2UJGgAAAA8XAAAALgAAAAJvcGVuYWNjZXNzLmF1dGhlbnRpY2F0aW9uLmludmFsaWRpbnRlcm5hbGxvZ2luDxoAAACJAAAAAlRoZSB1c2VybmFtZS9wYXNzd29yZCBjb21iaW5hdGlvbiB5b3UgaGF2ZSBlbnRlcmVkIGlzIGluY29ycmVjdC4gUGxlYXNlIG1ha2Ugc3VyZSB5b3VyIHVzZXJuYW1lIGlzIGNvcnJlY3QgYW5kIHRoZW4gcmV0eXBlIHlvdXIgcGFzc3dvcmQuCw==

1 Ответ

0 голосов
/ 24 мая 2019

Я заметил, что значения, десериализованные как Byte [], представляют символы ASCII.Рекурсивная функция (десериализованный словарь имеет вложенные словари) для преобразования их в строку с помощью Encoding.UTF8.GetString добилась цели.

...