在尝试将开源库(Aforge.net)移植到UWP时,我发现System.Serializable属性似乎不存在。 UWP的参考文献的工作方式略有不同,我仍然试图绕过变化,所以我希望我只是错过了一些简单的东西。
我的问题是,有人可以确认System.Serializable属性是否适用于UWP应用程序?我已经尝试通过MSDN和其他各种Google搜索来源,但无法找到任何证据。
非常感谢任何帮助。
更新
看起来我可能需要使用DataContract / DataMember属性而不是Serializable,就像这里提到的可移植库一样:Portable class library: recommended replacement for [Serializable]
思想?
答案 0 :(得分:14)
您需要使用以下属性:
用
标记班级[DataContract]
并使用
标记属性[DataMember]
或
[IgnoreDataMember]
例如:
[DataContract]
public class Foo
{
[DataMember]
public string Bar { get; set; }
[IgnoreDataMember]
public string FizzBuzz { get; set; }
}
答案 1 :(得分:3)
上面的代码来自Lance McCarthy:
[DataContract]
public class Foo
{
[DataMember]
public string SomeText { get; set; }
// ....
[IgnoreDataMember]
public string FizzBuzz { get; set; }
}
此外,您可以使用我自己的扩展(如果您需要将MemoryStream保存到文件而不是字符串,请将其更改为FileStream):
public static class Extensions
{
public static string Serialize<T>(this T obj)
{
var ms = new MemoryStream();
// Write an object to the Stream and leave it opened
using (var writer = XmlDictionaryWriter.CreateTextWriter(ms, Encoding.UTF8, ownsStream: false))
{
var ser = new DataContractSerializer(typeof(T));
ser.WriteObject(writer, obj);
}
// Read serialized string from Stream and close it
using (var reader = new StreamReader(ms, Encoding.UTF8))
{
ms.Position = 0;
return reader.ReadToEnd();
}
}
public static T Deserialize<T>(this string xml)
{
var ms = new MemoryStream();
// Write xml content to the Stream and leave it opened
using (var writer = new StreamWriter(ms, Encoding.UTF8, 512, leaveOpen: true))
{
writer.Write(xml);
writer.Flush();
ms.Position = 0;
}
// Read Stream to the Serializer and Deserialize and close it
using (var reader = XmlDictionaryReader.CreateTextReader(ms, Encoding.UTF8, new XmlDictionaryReaderQuotas(), null))
{
var ser = new DataContractSerializer(typeof(T));
return (T)ser.ReadObject(reader);
}
}
}
然后只使用这些扩展:
[TestClass]
public class UnitTest1
{
[TestMethod]
public void TestSerializer()
{
var obj = new Foo()
{
SomeText = "Sample String",
SomeNumber = 135,
SomeDate = DateTime.Now,
SomeBool = true,
};
// Try to serialize to string
string xml = obj.Serialize();
// Try to deserialize from string
var newObj = xml.Deserialize<Foo>();
Assert.AreEqual(obj.SomeText, newObj.SomeText);
Assert.AreEqual(obj.SomeNumber, newObj.SomeNumber);
Assert.AreEqual(obj.SomeDate, newObj.SomeDate);
Assert.AreEqual(obj.SomeBool, newObj.SomeBool);
}
}
祝你好运。
答案 2 :(得分:0)
有一招,
您可以覆盖这两个缺少引用的Class定义:
System.SerializableAttribute
System.ComponentModel.DesignerCategoryAttribute
这里是代码:
namespace System
{
internal class SerializableAttribute : Attribute
{
}
}
namespace System.ComponentModel
{
internal class DesignerCategoryAttribute : Attribute
{
public DesignerCategoryAttribute(string _) { }
}
}