如何在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*]
。停止。因此,根据您想要用来序列化数据的类/方法,您必须知道它将查找哪些属性。
使用[Serializable]属性非常好,它只是选择性退出而不是选择性输入。 –
@BenediktSchroeder默认情况下,它只序列化字段,而不是属性,所以我不会称之为“退出”。我会称它为“只有域名,除非退出(域)+选入(属性)” – xanatos