2015-05-09 171 views
0

我做了一個叫MyData的類,然後用[Serializable接口]標記,但它似乎並沒有工作...如何在C#中將標記類標記爲[Serializable]?

這裏的MyData.cs:

namespace Forms_Bot_Rebuild 
{ 
    [Serializable] 
    public class MyData 
    { 
     private String _Email; 
     private String _Password; 
     private String _WorldId; 
     public MyData(string email, string password, string worldid) 
     { 
      _Email = email; 
      _Password = password; 
      _WorldId = worldid; 
     } 
     public string Email 
     { get { return _Email; } set { _Email = value; } } 
     public string Password 
     { get { return _Password; } set { _Password = value; } } 
     public string WorldId 
     { get { return _WorldId; } set { _WorldId = value; } } 
    } 
} 

這裏的Form1.cs中:

private void button1_Click(object sender, EventArgs e) 
{ 
    MyData data = new MyData(boxEmail.Text, boxPass.Text, boxWorldId.Text); 
    string objectNode = Serialize.ToJsonString(data); 
    File.WriteAllText(Application.StartupPath + @"\LoginData.json", objectNode); 
} 
private void button2_Click(object sender, EventArgs e) 
{ 
    object myData; 
    myData = Serialize.Deserialize<MyData>(new FileStream(Application.StartupPath + @"\LoginData.json", FileMode.Open)); 
    boxEmail.Text = data.Email; 
    boxPass.Text = data.Password; 
    boxWorldId.Text = data.WorldId; 
} 

這裏的Serialize.cs:

public class Serialize 
{ 
    public static StreamReader ToStreamReader(object o) 
    { 
     MemoryStream stream = new MemoryStream(); 
     DataContractJsonSerializer ser = new DataContractJsonSerializer(o.GetType()); 
     ser.WriteObject(stream, o); 
     stream.Position = 0; 
     StreamReader sr = new StreamReader(stream); 
     return sr; 
    } 
    public static string ToJsonString(object o) 
    { 
     MemoryStream stream = new MemoryStream(); 
     DataContractJsonSerializer ser = new DataContractJsonSerializer(o.GetType()); 
     ser.WriteObject(stream, o); 
     stream.Position = 0; 
     StreamReader sr = new StreamReader(stream); 
     return sr.ReadToEnd(); 
    } 
    public static object Deserialize<T>(Stream stream) 
    { 
     DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T)); 
     stream.Position = 0; 
     T t = (T)ser.ReadObject(stream); 
     return t; 
    } 
} 

此外,該代碼被賦予到m我的朋友,所以我問他。他也無法理解。我問另一位朋友,我認爲他知道體面的C#,但他無法修復它。

類型「System.Runtime.Serialization.SerializationException」的未處理的異常發生在System.Runtime.Serialization.dll

其他信息:期待元件從命名空間「根」「」 ..遇到「無」與名字'',名字空間''。

有沒有意見?

回答

1

,才應使用

[DataContract] 

,而不是

[Serializable] 

[DataMember] 

標記所有屬性(但有趣地,在我的電腦工作,即使Serializable,它序列化字段而不是屬性...嗯,我看到有人注意到它:http://pietschsoft.com/post/2008/02/27/NET-35-JSON-Serialization-using-the-DataContractJsonSerializer

注意Deserialize可能有這樣的簽名:

public T Deserialize<T>(Stream stream) 

,並在使用後應關閉流:

MyData myData; 

using (var fs = new FileStream(Application.StartupPath + @"\LoginData.json""LoginData.json", FileMode.Open)) 
{ 
    myData = (MyData)Serialize.Deserialize<MyData>(fs); 
} 

相反,如果你真的想知道你在標題中寫道: :

每個序列化類/方法都會查找「其」序列化屬性(此時至少有三個屬性系列在Microsoft .NET中:[Serializable][Xml*]系列,[DataContract]。另外如果你使用JSON.NET,那麼它的屬性就是[Json*]。停止。因此,根據您想要用來序列化數據的類/方法,您必須知道它將查找哪些屬性。

+0

使用[Serializable]屬性非常好,它只是選擇性退出而不是選擇性輸入。 –

+0

@BenediktSchroeder默認情況下,它只序列化字段,而不是屬性,所以我不會稱之爲「退出」。我會稱它爲「只有域名,除非退出(域)+選入(屬性)」 – xanatos

相關問題