2015-05-13 78 views
1

我想序列化此不可變類飛鏢序列化不可變對象

class CatalogueItem { 
    final Uri source; 
    final DateTime analyis; 
    final Period fromTo; 

    CatalogueItem.create(this.source, this.analyis, this.fromTo); 
} 

但我不能,因爲它不是一個簡單的類。從網站https://www.dartlang.org/articles/serialization/

簡單:所有的對象被序列化的數據傳輸對象 (DTO的)用默認的構造函數。

所以我必須添加一個默認的構造函數 - 這意味着我必須刪除最終的關鍵字,我的類不再是不可變的。

class CatalogueItem { 
    Uri source; 
    DateTime analyis; 
    Period fromTo; 

    CatalogueItem.create(this.source, this.analyis, this.fromTo); 
    CatalogueItem(){} 
} 

有沒有辦法解決這個問題?

+0

嘗試dartson包,它提供了一些自定義選項。如果遇到錯誤或問題,請使用您嘗試的代碼和可能出現的任何錯誤更新此問題。謝謝! –

+0

我認爲默認的構造函數只對反序列化是必需的(從未使用過(de)序列化包)。序列化不應該需要它。 –

+0

如果在序列化對象時沒有公共默認構造函數,api會投訴。我也需要反序列化它 – richard

回答

1

我認爲默認的構造函數只對反序列化是必需的(從未使用過(de)序列化包)。序列化不應該需要它。

默認構造函數是多餘的,因爲如果反序列化包需要一個默認構造函數,它顯然會嘗試使用默認構造函數創建一個實例,然後設置字段值,這些值不能用於最終字段。

我不知道序列化包是否支持自定義的toJson()方法/ fromJson()構造函數,但我認爲這將是最簡單的方法。

class CatalogueItem { 
    final Uri source; 
    final DateTime analysis; 
    final Period fromTo; 

    CatalogueItem.create(this.source, this.analysis, this.fromTo); 
    factory CatalogueItem.fromJson(Map json) { 
    return new CatalogueItem.create(
     json['source'] == null ? null : Uri.parse(json['source']), 
     json['analysis'] == null ? null : DateTime.parse(json['analysis'])), 
     json['fromTo'] == null ? null : new Period.fromJson(json['fromTo'])); 
    } 

    Map toJson() { 
    return { 
     'source': source == null ? null : '$source', 
     'analysis': analysis == null ? null : '$analysis', 
     'fromTo': fromTo == null ? null : fromTo.toJson(); 
    } 
} 
0

一種選擇是在文章中進一步閱讀並使用序列化包,它處理這種情況。

1

https://github.com/google/built_value.dart可以做你想做的 - 它專門用於創建不可變的類並對它們進行序列化。

請注意,這需要一個略有不同的班級形式。這是爲了讓built_value爲你和序列化器生成一個實現。

abstract class CatalogueItem 
    implements Built<CatalogueItem, CatalogueItemBuilder> { 
    static Serializer<CatalogueItem> get serializer 
     => _$catalogueItemSerializer; 

    Uri get source; 
    DateTime get analyis; 
    Period get fromTo; 

    factory CatalogueItem([updates(CatalogueItemBuilder b)]) = 
     _$CatalogueItem; 
    CatalogueItem._(); 
} 

生成的實現是不可變的(使用final),並且還提供了operator ==,hashCode和toString。

更詳細的例子:https://github.com/google/built_value.dart/blob/master/example/lib/example.dart