标记类如何[Serializable]在C#中工作?

时间:2015-05-09 10:08:50

标签: c# json serialization

我创建了一个名为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;。

有什么意见吗?

1 个答案:

答案 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>