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 失败

Windows 10 UWP - 不可见时没有 DataContext 的 GridView 项目