我创建了一个名为MyData的类,并用[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;
}
}
此外,这段代码是由朋友送给我的,所以我问他。他也无法理解。我问了另一个朋友,在我看来,他知道体面的C#,但他也无法修复它。
未处理的类型&#39; System.Runtime.Serialization.SerializationException&#39;发生在System.Runtime.Serialization.dll
中其他信息:期待元素&#39; root&#39;来自命名空间&#39; ..遇到&#39;无&#39;名称&#39;&#39;,名称空间&#39;&#39;。
有什么意见吗?
答案 0 :(得分: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*]
系列,{{1另外,如果您使用JSON.NET,则有[DataContract]
属性。停止。因此,根据您要用于序列化数据的类/方法,您必须知道它将查找哪些属性。 / p>