2016-07-03 22 views
0

ゲームでスコアのシリアライズに奇妙な問題が発生しています。列挙型のキー、LevelBinaryFormatterの逆シリアル化に影響を及ぼす列挙の序数?

[System.Serializable] 
public class LevelHighScores 
{ 
    readonly Dictionary<Level, ModeScores> scores; 
    // clipped out the rest for simplicity 
} 

私はLevelHighScoreクラスを持っています。

私は最近、新しいレベルをゲームに追加しましたが、新しいレベルを列挙の最後に追加するのではなく、新しい列挙をアルファベット順に追加しました。ゲームをロードすると、新しいレベルには既存のスコアが関連付けられているため、列挙型の序数がシリアライゼーション/デシリアライゼーションに影響していると思うようになります。

将来的にレベルを追加する際にこの問題を回避することは避けたいと考えています。また、enumの最後にレベルを追加することだけを覚えておく必要はありません。

遡及的に新しい値を追加する場合でも、列挙型が一貫してデシリアライズされるようにする方法はありますか?

+0

レベルキー付き辞書の代わりに 'Dictionary 'を使うと、効果的な回避策のようです。列挙型の型安全性は失われますが。他の提案を聞くのが大好きです。 –

+1

順序が重要でないように、enum値を明示的に割り当てることができます。 https://stackoverflow.com/questions/1681285/pros-and-cons-explicitly-setting-enum-fields-values – dbc

+0

@dbcを参照してください。これは良い提案です。回答を拡大する必要があります –

答えて

0

私はdbc's suggestionに続き、明示的な値を列挙に追加しました。

ので、私は私が非UnityはScott Hannen's answerのプロジェクトのためだと思うが、これは、私の問題への素敵な簡単な解決策だった

// NOTE: the numbers here don't represent order, 
// they are just to ensure proper serialization 
public enum Level 
{ 
    AmazingPlan = 4, // new level 
    Aquarium = 0, 
    Crescendo = 1, 
    HungarianDance = 2, 
    MapleLeafRag = 3, 
} 

public enum Level 
{ 
    Aquarium, 
    Crescendo, 
    HungarianDance, 
    MapleLeafRag, 
} 

、からレベルを変更することは、おそらくへの道であります行く。

1

[DataContract]属性を列挙型に追加し、DataContractSerializerを使用してシリアル化します。個々の値に[EnumMember]属性を置きます。

これにより、値は数値ではなく名前でシリアル化されます。

XMLシリアル化の場合はファイル(またはXMLシリアル化の場合は文字列)にシリアル化することをテストし、それが動作することを確認し、名前でまだシリアル化されていないことを確認してください。それ以外の場合は、それが原因であるかどうかはわかりません。

+0

[さらにこれを見る](https://msdn.microsoft.com/en-us/library/aa347875(v = vs.85).aspx)、これは良い解決策のように見えます。残念ながら、UnityはデフォルトでDataContractsをサポートしていません。それを追加するSystem.Runtime.Serialization.dllをインポートすることができるように見えますが、私はそれが私の特定のプロジェクトのための最善の解決策であるとは確信していません。 –

関連する問題