2015-09-25 26 views
2

所以我想用bincode來序列化一個結構跟在這些instructions之後,並且我能夠讓它工作。用當地版本替換板條箱依賴關係時出現的問題

但後來我想用IpAddr enum序列化一個結構。由於IpAddr沒有實現所需的特性Encodable,我從git下載了rustc_serialize包,並自己實現了IpAddr的可編碼。然後,我改變了我的Cargo.toml文件:

[dependencies] 
# rustc-serialize = "0.3" 
byteorder = "0.3" 
bincode = "0.4" 

[dependencies.rustc-serialize] 
path = "src/rustc-serialize-master" 

但現在,從我使用的是不編譯結構相同的代碼說 rustc_serialize::serialize::Encodable不是爲我的結構實現的,即使我有#[derive(RustcEncodable)]的結構之上。

即使我擺脫了我添加到本地版本的rustc_serialize的代碼,我仍然得到了該錯誤。

我認爲這可能是由於bincode和本地的rustc_serialize交互方式搞砸了某些東西,但我不確定。

+0

對於什麼是值得的,fork'rustc-serialize'爲其他類型添加編碼可能是一個壞主意。對於包含'IpAddr'的結構,手工實現'Encodable'特性可能更爲理智。 – Shepmaster

+0

我試過了,但是我得到了「在當前箱子中定義的唯一特徵可以實現任意類型」的錯誤。對於沒有定義的結構(導入的IpAddr),您似乎無法爲未定義的特徵實現特徵(導入rustc-serialize'可編碼特徵)。 如果你已經能夠做到這一點,請告訴我。謝謝! –

+0

看看[我如何實現我不擁有的特性,我不擁有?](http://stackoverflow.com/q/25413201/155423)。包裝類型在這裏是正確的解決方案。在你的情況下,你已經有了一個包裝類型(*序列化**結構**與IpAddr枚舉*)。無論你的結構是什麼,你都可以手動實現'Encodable'。 – Shepmaster

回答

4

請檢查Cargo documentation on overriding dependencies

要指定覆蓋,在項目的目錄中的一些祖先創建一個.cargo/config文件(常見的地方把它在你的代碼目錄你的主目錄或根) 。

在這個文件中,把這個:

paths = ["/path/to/project/rand"] 

不斷深入,你很可能遇到了issue 22750 - 兩個不同版本一箱相互作用導致的錯誤消息無用的。當你添加rustc-serialize到你的dependencies,你不是代替的舊版本,你是加入一個新的。

一般來說,這是一個很好的功能。如果我的項目依賴於板條箱A和B,並且它們都依賴於板條箱Z但版本不同,Rust可以很好地處理。當他們從這些板條箱出口物品時出現問題。

+0

這似乎已經解決了它。謝謝! –