2015-07-10 51 views
1

我有一個類作爲這樣對象反序列在C#

[Serializable] 
public class ExternalAccount 
{ 
    public string Name { get;set;}  
} 

我已經轉換這JSON像這樣

{\"Name\":\"XYZ\"} 

我已經然後base64編碼JSON字符串

然後我通過網絡發送到web api服務

我收到base64編碼的字符串,現在需要de-將其序列化回原始對象(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; 
    } 

任何指針/提示不勝感激。

+2

'BinaryFormatter'不能反序列化來自JSON字符串的對象。它是.NET特定的二進制序列化格式。你能展示如何將JSON字符串編碼爲BASE64的完整示例嗎? – hal

+0

你真的需要以base-64字符串的形式發佈到你的API嗎?如果可能,請更新您的API,以便您可以發送普通的JSON。感謝Hal - – LukeH

+0

- 這對未來很有用。 – AdrianSean

回答

8

您可以嘗試將字節數組轉換回字符串(它將與您發送的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; } 
} 
+0

@ Volkan ..我有一個類似的問題發佈在這裏:http://stackoverflow.com/questions/38967614/base64-decode-json-array-sent-from-url。我試過這個答案,但我錯過了一些東西。 – DBS

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