사용자 정보를 저장하기 위해 파일에 저장되는 User 클래스가있는 프로그램을 작성했습니다. 그러나 여러 다른 사용자가있을 수 있으므로 파일을 단일 사용자로 저장하는 대신 사용자 목록입니다. 이것은 XNA에 있으므로 게임이기는하지만 실제로는 사물에 영향을주지 않아야합니다. 사용자는 동전, 스킨, 인벤토리, 사용자 이름, 암호 (있는 경우) 및 hasPassword bool을가집니다. 사용자가 동전을 가지고 있기 때문에 편집 가능한 텍스트 파일이 아니기 때문에 바이너리 파일로 저장했습니다. 필자는 목록에 여러 사용자를 저장하려고 시도 할 때까지 일부 코드를 작성하고 테스트했으며 모든 것이 훌륭하고 훌륭했습니다. 어떤 이유로 두 번째 사용자를 저장하고 List에서 읽을 때마다 목록에는 하나의 개체 (첫 번째 사용자) 만있었습니다. 나는에보고C# : 이진 파일로 목록 작성 및 읽기
User test = new User("Bob", 0, "skin1", Content)
test.SerializeUser();
: 여기
[Serializable]
class User
{
#region Fields & Properties
public string Username = "";
public string Password = "";
public bool HasPassword = false;
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; }
const int SPACING = 10;
const string FILE_PATH = "Users.bin";
#endregion
#region Constructors
public User(string username, int coins, string skinPath, ContentManager content)
{
Username = username;
CurrentSkinAsset = skinPath;
}
public User(string username, string password, int coins, string skinPath, ContentManager content)
: this(username, coins, skinPath, content)
{
HasPassword = true;
Password = password;
}
#endregion
#region Public Methods
public static List<User> LoadUsers()
{
FileStream fileStream = null;
List<User> returnList = null;
try
{
if (File.Exists(FILE_PATH))
{
fileStream = new FileStream(FILE_PATH, FileMode.Open, FileAccess.Read);
BinaryFormatter deserializer = new BinaryFormatter();
returnList = (List<User>)deserializer.Deserialize(fileStream);
}
else
{
fileStream = File.Create(FILE_PATH);
List<User> users = new List<User>();
BinaryFormatter serializer = new BinaryFormatter();
serializer.Serialize(fileStream, users);
}
}
catch (Exception e)
{
Console.WriteLine("There's been an error. Here is the message: " + e.Message);
}
finally
{
if (fileStream != null)
{
fileStream.Close();
}
}
return returnList;
}
public void SerializeUser()
{
// Also works
FileStream fileStream = null;
List<User> users;
BinaryFormatter binaryFormatter = new BinaryFormatter();
try
{
if (File.Exists(FILE_PATH))
{
fileStream = File.Open(FILE_PATH, FileMode.Open);
//fileStream = new FileStream(FILE_PATH, FileMode.Open, FileAccess.ReadWrite);
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].Username.ToLower() == this.Username.ToLower())
{
users.Remove(users[i]);
}
}
users.Add(this);
binaryFormatter.Serialize(fileStream, users);
}
catch (Exception e)
{
Console.WriteLine("There's been an error. Here is the message: " + e.Message);
}
finally
{
if (fileStream != null)
{
fileStream.Close();
}
}
}
#endregion
}
합니다 (GAME1 LoadContent 방법에서) 내가 쓴 테스트 코드입니다 : 자, 내가 쉽게이 이해할 수 있도록하기 위해 코드와 예제를 제공합니다 Debug 폴더를 열고 "Users.bin"이라는 새 파일을 찾았습니다. 예상대로 임의의 문자가 잔뜩 있습니다. 테스트의 사용자 이름 매개 변수를 "Bob"에서 "Joe"로 변경했습니다. 그러면 새 사용자가 추가됩니다.
List<User> testList = User.LoadUsers();
내가 코드의 다음 줄에 중단 점을 삽입하고, testList 맴돌고 있지만에만 표시 사용자가 밥, 그리고 조 :하지만 ... 여기
는 사용자가 읽을 수있는 코드이다 존재하지 않았다. 어떤 아이디어? 또한 : 나는 13 세입니다. 내가 오랫동안 프로그래밍하지 않았기 때문에 내가 사용하는 모든 용어를 이해하지 못할 수도 있습니다. 미리 감사드립니다.
질문과 관련이 없지만 [MonoGame] (http://www.monogame.net/)을 살펴볼 수 있습니다. Microsoft는 몇 년 전 XNA Framework 개발을 중단했지만 MonoGame은 XNA Framework 4의 적극적으로 개발 된 오픈 소스 구현입니다. XNA와 달리 Android, iOS, Linux, OS X, PS4 등의 플랫폼도 지원합니다. 행운을 비네! – hankide
감사합니다. 생각 MonoGame은 Xna 등의 Mac 버전이었습니다. –