【问题标题】:System.Serializable attribute gone in Windows 10 UWP apps?Windows 10 UWP 应用程序中的 System.Serializable 属性消失了吗?
【发布时间】: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]

想法?

【问题讨论】:

  • 为什么没有评论就投反对票?
  • 我没有投反对票,但这里没有问题,所以我明白为什么有人会投反对票。
  • 公平点。已编辑以包含一个问题。

标签: .net windows uwp


【解决方案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 _) { }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2018-10-31
        • 2018-07-06
        • 2015-11-08
        • 2019-07-31
        • 2016-08-02
        • 2018-08-31
        • 2017-09-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多