System.Serializable属性在Windows 10 UWP应用程序中消失了吗?

问题描述 投票:11回答:3

在尝试将开源库(Aforge.net)移植到UWP时,我发现System.Serializable属性似乎不存在。 UWP的参考工作有点不同,我仍然试图围绕这些变化,所以我希望我只是错过了一些简单的东西。

我的问题是,有人可以确认System.Serializable属性是否适用于UWP应用程序?我试过通过MSDN和各种其他谷歌来源,但无法找到任何证据。

任何帮助是极大的赞赏。

更新 看起来我可能需要使用DataContract / DataMember属性而不是Serializable,就像这里提到的可移植库一样:Portable class library: recommended replacement for [Serializable]

思考?

.net windows uwp
3个回答
14
投票

您需要使用以下属性:

用这个标记课程

[DataContract]

和标记属性

[DataMember]

要么

[IgnoreDataMember]

例如:

[DataContract]
public class Foo
{
    [DataMember]
    public string Bar { get; set; }

    [IgnoreDataMember]
    public string FizzBuzz { get; set; }
}

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);
    }
}

祝你好运。


0
投票

有一招,

您可以覆盖这两个缺少引用的Class定义:

System.SerializableAttribute
System.ComponentModel.DesignerCategoryAttribute

这里的代码:

namespace System
{
    internal class SerializableAttribute : Attribute
    {

    }
}
namespace System.ComponentModel
{
    internal class DesignerCategoryAttribute : Attribute
    {
        public DesignerCategoryAttribute(string _) { }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.