Dot-Net

Windows 10 UWP 應用程序中的 System.Serializable 屬性消失了嗎?

  • December 29, 2017

在嘗試將開源庫 (Aforge.net) 移植到 UWP 時,我發現 System.Serializable 屬性似乎不存在。UWP 參考的工作方式略有不同,我仍在努力解決這些變化,所以我希望我只是遺漏了一些簡單的東西。

我的問題是,有人可以確認 System.Serializable 屬性在 UWP 應用程序中是否有效/應該有效嗎?我試過瀏覽 MSDN 和其他各種穀歌資源,但找不到任何證據。

任何幫助是極大的讚賞。

更新

看起來我可能需要使用 DataContract / DataMember 屬性而不是 Serializable 就像這裡提到的攜帶式庫:攜帶式類庫:推薦替換$$ Serializable $$

想法?

您需要使用以下屬性:

[DataContract]

並用

[DataMember]

或者

[IgnoreDataMember]

例如:

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

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

正如上面來自 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);
   }
}

祝你好運朋友。

引用自:https://stackoverflow.com/questions/32446989