2015-09-07 108 views
10

嘗試將開源庫(Aforge.net)移植到UWP時,我發現System.Serializable屬性似乎不存在。 UWP的參考工作有點不同,我仍然試圖圍繞這些變化進行思考,所以我希望我只是缺少一些簡單的東西。Windows 10 UWP應用程序中沒有System.Serializable屬性?

我的問題是,有人可以確認是否System.Serializable屬性工作/應該在UW​​P應用程序中工作?我試圖通過MSDN和其他各種谷歌資源尋找,但無法以任何方式找到任何證據。

任何幫助,非常感謝。

更新
它看起來像我可能需要使用像在這裏提到的便攜式庫DataContract /數據成員的屬性,而不是Serializable接口:Portable class library: recommended replacement for [Serializable]

的思考?

+0

爲什麼反對票,無評論? – John

+0

我沒有downvote,但這裏沒有問題,所以我可以明白爲什麼有人會。 –

+0

公平點。編輯包含一個問題。 – John

回答

13

您需要使用以下屬性:與

[DataMember] 

[IgnoreDataMember] 

例如

馬克與

[DataContract] 

類和標記屬性:

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

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

由於從蘭斯·麥卡錫上面的代碼:

[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

有一個小竅門,

您可以覆蓋這兩名失蹤引用的類定義:

System.SerializableAttribute 
System.ComponentModel.DesignerCategoryAttribute 

下面的代碼:

namespace System 
{ 
    internal class SerializableAttribute : Attribute 
    { 

    } 
} 
namespace System.ComponentModel 
{ 
    internal class DesignerCategoryAttribute : Attribute 
    { 
     public DesignerCategoryAttribute(string _) { } 
    } 
} 
相關問題