在 C# 中从 base64 反序列化对象

Posted

技术标签:

【中文标题】在 C# 中从 base64 反序列化对象【英文标题】:Object de-serializing from base64 in C# 【发布时间】:2015-09-29 03:21:59 【问题描述】:

我也有一堂课

[Serializable]
public class ExternalAccount

  public string Name  get;set;      

我已经把它转换成 JSON 格式

\"Name\":\"XYZ\"

然后我对 JSON 字符串进行了 base64 编码

然后我通过网络发送到 Web api 服务

我收到了 base64 编码的字符串,现在需要将其反序列化回原来的对象,如上(ExternalAccount)所以我首先做一个

byte[] byteArray = Convert.FromBase64String(base64EncodedExternalAccount);

下一步是什么?

我已经尝试了以下,但返回 null...

using (MemoryStream memoryStream = new MemoryStream(byteArrayToConvert))
 
            BinaryFormatter binaryFormatter = new BinaryFormatter();

            // set memory stream position to starting point
            memoryStream.Position = 0;

            // Deserializes a stream into an object graph and return as a               object.
            return binaryFormatter.Deserialize(memoryStream) as ExternalAccount;
  

非常感谢任何指针/提示。

【问题讨论】:

BinaryFormatter 无法从 JSON 字符串反序列化对象。它是 .NET 特定的二进制序列化格式。您能否展示如何将 JSON 字符串编码为 BASE64 的完整示例? 您真的需要以 base-64 字符串的形式发布到您的 API 吗?如果可能,请更新您的 API,以便您可以发送纯 JSON。 感谢 Hal - 对未来有所了解。 @LukeH - 是的,我需要对字符串进行 base64 编码,因为我在上面的代码示例中省略了大量属性,我想确保对象在传输过程中不会被意外弄乱 【参考方案1】:

您可以尝试将字节数组转换回字符串(它将与您发送的相同 JSON),然后反序列化为 ExternalAccount 对象。使用 Newtonsoft JSON 库,以下示例在控制台上正确显示“某人”:

class Program

    static void Main(string[] args)
    
        var account = new ExternalAccount()  Name = "Someone" ;
        string json = JsonConvert.SerializeObject(account);
        string base64EncodedExternalAccount = Convert.ToBase64String(Encoding.UTF8.GetBytes(json));
        byte[] byteArray = Convert.FromBase64String(base64EncodedExternalAccount);

        string jsonBack = Encoding.UTF8.GetString(byteArray);
        var accountBack = JsonConvert.DeserializeObject<ExternalAccount>(jsonBack);
        Console.WriteLine(accountBack.Name);
        Console.ReadLine();
    


[Serializable]
public class ExternalAccount

    public string Name  get; set; 

【讨论】:

@Volkan..我在这里发布了类似的问题:***.com/questions/38967614/…。我试过这个答案,但我错过了一些东西。【参考方案2】:

您需要从收到的字节中提取字符串。

byte[] byteArray = Convert.FromBase64String(base64EncodedExternalAccount);
string AccountInfo = System.Text.Encoding.UTF8.GetString(byteArray );

正如预期的那样,您将在您的AccountInfo 字符串中获得\"Name\":\"XYZ\"。现在你需要Deserialize。您可以使用相同的型号,ExternalAccount。你可以这样做:

ExnternalAccount model = new System.Web.Script.Serialization.javascriptSerializer().Deserialize<ExnternalAccount>(AccountInfo );

【讨论】:

以上是关于在 C# 中从 base64 反序列化对象的主要内容,如果未能解决你的问题,请参考以下文章

将 ODATA xml 序列化/反序列化为 C# 对象

反序列化失败:base-64 字符数组的长度无效

使用Base64编码的类序列化/反序列化

在 C# 中反序列化复杂对象

在 C# 中从 json 中创建动态对象

c# Base64编码和图片的互相转换代码