如何在C#中将标记类标记为[Serializable]?

问题描述:

我做了一个叫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

其他信息:期待元件从命名空间“根”“” ..遇到“无”与名字'',名字空间''。

有没有意见?

,才应使用

[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