Search code examples
c#dictionaryserializationbinaryformatter

C# - BinaryFormatter.Deserialize leaves some values as Byte[]


EDIT: I don't have control over the serialization so using json is not an option.

I'm using BinaryFormatter to deserialize a Dictionary<string, object>. The plain representation of the dictionary is:

{
    "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"
}

The only key-value pair that is properly deserialized is the last one ("business_event_class"), as both sides are translated to string. In all the other cases, including the nested dictionary ("error") keys are translated to string but values stay as Byte[].

My code:

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>;

The encoded (base64) dictionary object is:

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

Solution

  • I noticed that the values deserialized as Byte[] represented ASCII characters. A recursive function (the deserialized dictionary has nested dictionaries) to convert them to string using Encoding.UTF8.GetString did the trick.