在 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 反序列化对象的主要内容,如果未能解决你的问题,请参考以下文章