Windows 10 UWP 应用程序中的 System.Serializable 属性消失了吗?
Posted
技术标签:
【中文标题】Windows 10 UWP 应用程序中的 System.Serializable 属性消失了吗?【英文标题】:System.Serializable attribute gone in Windows 10 UWP apps? 【发布时间】:2015-12-03 12:00:52 【问题描述】:在尝试将开源库 (Aforge.net) 移植到 UWP 时,我发现 System.Serializable 属性似乎不存在。 UWP 参考的工作方式略有不同,我仍在努力了解这些变化,所以我希望我只是遗漏了一些简单的东西。
我的问题是,有人可以确认 System.Serializable 属性在 UWP 应用程序中是否有效/应该有效吗?我试过浏览 MSDN 和其他各种谷歌资源,但找不到任何证据。
非常感谢任何帮助。
更新 看起来我可能需要使用 DataContract / DataMember 属性而不是 Serializable ,就像这里提到的可移植库一样:Portable class library: recommended replacement for [Serializable]
想法?
【问题讨论】:
为什么没有评论就投反对票? 我没有投反对票,但这里没有问题,所以我明白为什么有人会投反对票。 公平点。已编辑以包含一个问题。 【参考方案1】:您需要使用以下属性:
用
标记班级[DataContract]
并用
标记属性[DataMember]
或
[IgnoreDataMember]
例如:
[DataContract]
public class Foo
[DataMember]
public string Bar get; set;
[IgnoreDataMember]
public string FizzBuzz get; set;
【讨论】:
【参考方案2】:上面的代码来自 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);
祝你好运。
【讨论】:
【参考方案3】:有个窍门,
您可以覆盖这两个缺失引用的类定义:
System.SerializableAttribute
System.ComponentModel.DesignerCategoryAttribute
代码如下:
namespace System
internal class SerializableAttribute : Attribute
namespace System.ComponentModel
internal class DesignerCategoryAttribute : Attribute
public DesignerCategoryAttribute(string _)
【讨论】:
以上是关于Windows 10 UWP 应用程序中的 System.Serializable 属性消失了吗?的主要内容,如果未能解决你的问题,请参考以下文章
Cordova Windows 10 UWP 应用程序中的黑屏
以编程方式更改 Windows 10 UWP 应用程序中的主题
如何使用 C# 从 Windows 10 日历中检索 UWP 中的约会
Windows-10 UWP 将图像 url 绑定到 ListView 中的图像源
用于 Microsoft 商店的 Javascript Windows 10 UWP 应用程序中的 decodeAudioData 失败