2015-06-30 67 views
0

所以這裏有雲,C#二進制序列化錯誤

我有以下的JSON字符串:

{"sTest":"Hello","oTest":{"vTest":{},iTest:0.0}} 

而且我反序列化使用Newtonsoft.JSON如下面的那樣:

Dictionary<string, dynamic> obj = JsonConvert.DeserializeObject<Dictionary<string, dynamic>>(json) 

問題是,我有一個要求,我需要使用BinaryFormatter將該對象序列化爲二進制文件。並通過執行以下操作:

Stream stream = new FileStream(System.Web.HttpContext.Current.Server.MapPath("~/_etc/") + "obj.dat", FileMode.Create, FileAccess.ReadWrite, FileShare.Read); 
BinaryFormatter serializer = new BinaryFormatter(); 
serializer.Serialize(stream, e.props); 
stream.Close(); 

我得到了一個錯誤說:

類型 'Newtonsoft.Json.Linq.JObject' 在大會「Newtonsoft.Json,版本= 6.0.0.0,文化=中立,PublicKeyToken = xxxxxxxxxxxxxxx'未被標記爲可串行化。

我不知道如何繼續。有什麼我失蹤?有任何想法嗎?謝謝!

回答

3

要使用BinaryFormatter,您需要創建可序列化的類來匹配JSON中的數據。因此,例如:

// I'm hoping the real names are rather more useful - or you could use 
// Json.NET attributes to perform mapping. 
[Serializable] 
public class Foo 
{ 
    public string sTest { get; set; } 
    public Bar oTest { get; set; } 
} 

[Serializable] 
public class Bar 
{ 
    public List<string> vTest { get; set; } 
    public double iTest { get; set; } 
} 

然後你可以從JSON反序列化到Foo,然後序列化實例。

+0

這是否意味着我無法將動態對象序列化爲二進制文件?有沒有另外的工作可以讓我這麼做?無論如何,非常感謝,隊友! –

+1

@GalihDonoPrabowo:那麼真的沒有像「動態對象」那樣的東西 - 你試圖序列化一個'JObject'。 'BinaryFormatter'不知道你的變量使用'dynamic'。就我個人而言,我建議嘗試擺脫這一要求 - .NET二進制格式化程序非常脆弱並且以各種方式煩人......如果您真正的需求是緊湊的表示形式,那麼還有很多其他選項。 (和「二進制文件」並不意味着「必須使用.NET binary serializatoin」) –

+0

可能用['[Serializable]']標記類(https://msdn.microsoft.com/en-us/ library/system.serializableattribute%28v = vs.110%29.aspx)會比實現['ISerializable']更簡單(https://msdn.microsoft.com/en-us/library/system.runtime.serialization.iserializable %28V = vs.110%29.aspx)。 – dbc