私はゲームを作っており、ユーザーの進行状況をバイナリファイルでコンピュータに保存しています。 User
クラスの店がいくつか:STAT値についてゲームがこのクラスをシリアル化しているのはなぜですか?
- 整数(直列化)
- ユーザー名のための文字列と皮膚の資産、私が作成した
Achievement
クラスとInventoryItem
クラスの両方の - リスト、私自身。すべての直列化可能です
public string Username = ""; // ID is used for local identification, as usernames can be changed. public int ID; public int Coins = 0; public List<Achievement> AchievementsCompleted = new List<Achievement>(); public List<InventoryItem> Inventory = new List<InventoryItem>(); public List<string> Skins = new List<string>(); public string CurrentSkinAsset { get; set; }
Achievement
クラス店int
秒、bool
秒、およびstring
秒、:ここで
はUser
フィールドです。 InventoryItem
クラスには、その名前(文字列)とアイテムの使用時に呼び出されるデリゲートであるInventoryActionが格納されます。
これらはAchievement
クラスのフィールドです:
public int ID = 0;
public string Name = "";
public bool Earned = false;
public string Description = "";
public string Image;
public AchievmentDifficulty Difficulty;
public int CoinsOnCompletion = 0;
public AchievementMethod OnCompletion;
public AchievementCriteria CompletionCriteria;
public bool Completed = false;
そして、ここではInventoryItem
クラスのフィールドです:
InventoryAction actionWhenUsed;
public string Name;
public string AssetName;
はInventoryAction変数のソース私のXNAGame
クラスです。つまり、XNAGame
クラスには「UseSword()」などのメソッドがあり、これをInventoryItemクラスに渡します。以前は、メソッドはGame1
クラスに格納されていましたが、Game
クラス(これはGame1
から継承されています)は直列化できず、それを制御する方法はありません。これが私がXNAGame
クラスを持っている理由です。
シリアル化しようとするとエラーが発生します。「 'SpriteFont'クラスはシリアル化可能とマークされていません」などです。まあ、私のXNAGame
クラスにSpriteFontオブジェクトがあり、いくつかのクイックテストでは、これが問題の原因であることがわかりました。まあ、私はSpriteFontクラスがSerializableかどうかを制御できません。
なぜこのゲームが行われますか? XNAGame
クラスのすべてのフィールドを直列化可能にしなければならない理由は何ですか?いくつかの方法がありますか?
私が13歳だと答えるときは、あなたが使用しているすべての用語を理解していない可能性があります。コードサンプルが必要な場合は、それらを提供してくれることをうれしく思います。前もって感謝します!
編集私が考えている解決策の1つは、Dictionary
にInventoryActionデリゲートを保存することですが、これは苦痛になり、プログラミングの面ではあまり良くありません。これが唯一の方法だとすれば、私はそれを受け入れます(正直なところ、これが最良の解決策だと思います)。
EDIT 2:これはUser.Serializeメソッドのコードです(私は非効率で何をしているのか知っています。データベースを使用する必要があります、blah、blah、blah)。今すぐ私と一緒にクマ):。
FileStream fileStream = null;
List<User> users;
BinaryFormatter binaryFormatter = new BinaryFormatter();
try
{
if (File.Exists(FILE_PATH) && !IsFileLocked(FILE_PATH))
{
fileStream = File.Open(FILE_PATH, FileMode.Open);
users = (List<User>)binaryFormatter.Deserialize(fileStream);
}
else
{
fileStream = File.Create(FILE_PATH);
users = new List<User>();
}
for (int i = 0; i < users.Count; i++)
{
if (users[i].ID == this.ID)
{
users.Remove(users[i]);
}
}
foreach (Achievement a in AchievementsCompleted)
{
if (a.CompletionCriteria != null)
{
a.CompletionCriteria = null;
}
if (a.OnCompletion != null)
{
a.OnCompletion = null;
}
}
users.Add(this);
fileStream.Position = 0;
binaryFormatter.Serialize(fileStream, users);
単語を使って*説明するのではなく、コードを投稿する必要があります。 – Aybe
いくつかのコードサンプルを投稿してください。シリアライズしているクラスのコードを見る必要があります。シリアライズ可能でないクラスへの参照があります。 – PhillipH
@Aybe私は、Userクラス、InventoryInterfaceクラス、およびAchievementクラスのコードを追加しました。 –