Member 7995828 Ответов: 2

Как я могу использовать binaryformatter для сериализации/десериализации существующего текстового файла?


У меня есть Строка рецепта UMA в основном представляет собой XML файл и я не хочу, чтобы пользователи редактировали этот файл.

Что я уже пробовал:

                characterRecipe = dcAvatar.GetCurrentRecipe();
                FileUtils.WriteAllText(charRecipeFilePath, characterRecipe);

                string recipeFileText = File.ReadAllText(charRecipeFilePath);
                using (Stream recipeFileStream = File.Open(charRecipeFilePath, FileMode.Create))
                {
                    binaryFormatter.Serialize(recipeFileStream, recipeFileText);
                }

I don't get an error, but the file is now empty

Richard MacCutchan

Вы проверили, что действительно получили некоторые данные в recipeFileText? Кроме того, сериализация текста в двоичный файл ничего не изменит; люди все равно смогут редактировать его.

Member 7995828

Я это заметил. Я создал класс для некоторых строковых данных и получил редактируемый текстовый файл. Я попробую изменить расширение на .sav
Спасибо

публичный класс UmaInfoData
{
публичная строка UmaInfo_name { get; set; }
публичная строка UmaInfo_class { get; set; }
публичная строка UmaInfo_race { get; set; }
публичная строка UmaInfo_gender { get; set; }
публичная строка UmaInfo_hp { get; set; }
публичная строка UmaInfo_crestName { get; set; }
публичная строка UmaInfo_weapon { get; set; }
публичная строка UmaInfo_shield { get; set; }

публичная UmaInfoData() { }

общественные UmaInfoData(имя строки, строки класса cclass, строки расы, пол строки, строки л. с., crestName строки, строки, оружие, щит строку)
{
UmaInfo_name = имя;
UmaInfo_class = cclass;
UmaInfo_race = гонка;
UmaInfo_gender = пол;
UmaInfo_hp = л. с.;
UmaInfo_weapon = оружие;
UmaInfo_shield = щит;
}
}


UmaInfoData charInfoData = новая UmaInfoData
(
charInfo_Name.текст,
classInfo_Text.текст,
raceInfo_Text.текст,
genderInfo_Text.текст,
hpInfo_Text.text, crest.sprite.name,
rHandWeapon.название,
lHandItemName
);

использование (FileStream infoFileStream = File.Создать(charInfoFilePath))
{
двоичный форматер.Сериализация(infoFileStream, charInfoData);
}

содержимое файла:

ÿïÿÿ fassembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null UmaInfoData <umainfo_name>k__BackingField<umainfo_class>k__BackingField<umainfo_race>k__BackingField<umainfo_gender>k__BackingField<umainfo_hp>k__BackingField"<umainfo_crestname>k__BackingField<umainfo_weapon>k__BackingField<umainfo_shield>k__Бэкингфилд Луна вор человеческая женщина 30

Алимер Топор Девастер Щит

Richard MacCutchan

Вы можете изменить расширение на все, что вам нравится, это не изменит содержимое файла. Если вы сделаете файл доступным для своих пользователей, то вы не сможете легко запретить им редактировать или удалять его. Чего именно вы здесь добиваетесь?

Member 7995828

В принципе, я не хочу, чтобы игрок менял поля в файле напрямую.
Например, количество хит-пойнтов: 30

2 Ответов

Рейтинг:
2

Member 7995828

Я попробовал это сделать:
Путь это: строка charRecipeFilePath = приложение.persistentDataPath + "/рецепт символ" + "/" + плеер.имя + ".тхт";

characterRecipe = dcAvatar.GetCurrentRecipe();
//FileUtils.WriteAllText(charRecipeFilePath, characterRecipe);

using (FileStream recipeFileStream = File.Create(charRecipeFilePath))
{
    binaryFormatter.Serialize(recipeFileStream, characterRecipe);
}


Файл Luna(женский)_CIROSTRIX15.txt содержит:

   ÿÿÿÿ          Ë{"packedRecipeType":"DynamicCharacterAvatar","name":"Luna(Female)_CIROSTRIX15","race":"G3 Human Female","dna":[{"dnaType":"DynamicUMADna","dnaTypeHash":1673940569,"packedDna":"{\"bDnaAsset\":{\"instanceID\":38920},\"bDnaAssetName\":\"G3HF DynamicUMADnaAsset\",\"bDnaSettings\":[{\"name\":\"BodyDetails\",\"value\":128},{\"name\":\"BodySize\",\"value\":128},{\"name\":\"BodyBulk\",\"value\":128},{\"name\":\"BodyThickness\",\"value\":128},{\"name\":\"BodyHeight\",\"value\":128},{\"name\":\"BodyAnna\",\"value\":128},{\"name\":\"BodyBriley\",\"value\":128},{\"name\":\"BodyCathy\",\"value\":128},{\"name\":\"BodyClarice\",\"value\":128},{\"name\":\"BodyFilia\",\"value\":128},{\"name\":\"BodyGia\",\"value\":128},{\"name\":\"BodyIrelia\",\"value\":128},{\"name\":\"BodyJazmine\",\"value\":128},{\"name\":\"BodyLaura\",\"value\":128},{\"name\":\"BodyLindsey\",\"value\":128},{\"name\":\"BodyMonique\",\"value\":128},{\"name\":\"BodySenna\",\"value\":128},{\"name\":\"BodySunny\",\"value\":128},{\"name\":\"BodyTisha\",\"value\":128},{\"name\":\"BodyUma\",\"value\":128},{\"name\":\"HeadAnna\",\"value\":128},{\"name\":\"HeadBriley\",\"value\":128},{\"name\":\"HeadCathy\",\"value\":128},{\"name\":\"HeadClarice\",\"value\":128},{\"name\":\"HeadFilia\",\"value\":128},{\"name\":\"HeadGia\",\"value\":128},{\"name\":\"HeadIrelia\",\"value\":128},{\"name\":\"HeadJazmine\",\"value\":128},{\"name\":\"HeadLaura\",\"value\":128},{\"name\":\"HeadLindsey\",\"value\":128},{\"name\":\"HeadMonique\",\"value\":128},{\"name\":\"HeadSenna\",\"value\":128},{\"name\":\"HeadSunny\",\"value\":128},{\"name\":\"HeadTisha\",\"value\":128},{\"name\":\"HeadUMA\",\"value\":128},{\"name\":\"BreastSmall\",\"value\":128},{\"name\":\"BreastLarge\",\"value\":128},{\"name\":\"NipplesLength\",\"value\":128},{\"name\":\"NipplesSize\",\"value\":128},{\"name\":\"AreolaSize\",\"value\":128},{\"name\":\"GluteSize\",\"value\":128},{\"name\":\"HipSize\",\"value\":128},{\"name\":\"HeadElfEars\",\"value\":128},{\"name\":\"HeadSize\",\"value\":128}]}"}],"characterColors":[{"name":"Skin","colors":[240,210,159,255,0,0,0,0,255,255,255,255,0,0,0,0,255,255,255,255,0,0,0,0]},{"name":"Hair","colors":[50,30,2,255,0,0,0,0,255,255,255,255,0,0,0,0,255,255,255,255,0,0,0,0]},{"name":"Eyes","colors":[10,11,165,255,0,0,0,0,255,255,255,255,0,0,0,0,255,255,255,255,0,0,0,0]}],"wardrobeSet":[{"slot":"Hair","recipe":"G3F ShortToulouse Hair"},{"slot":"WardrobeCollection","recipe":"G3F JG_FullOutfit"}],"raceAnimatorController":"G3F AnimationCntrlr"}

Большая часть содержимого файла может быть отредактирована.


F-ES Sitecore

Как вам уже было сказано, создание двоичного файла не дает ему никакой защиты и не останавливает людей, редактирующих его. Если вы хотите защитить файл, то зашифруйте его при сохранении и расшифруйте при загрузке.

Member 7995828

Спасибо я постараюсь, что.

Richard MacCutchan

Это не XML, он больше похож на JSON, но неправильно отформатирован. Откуда вы его взяли?

Member 7995828

Это часть структуры UMA.
characterRecipe = dcAvatar.GetCurrentRecipe();

{"packedRecipeType":"DynamicCharacterAvatar","name":"Luna(Female)_CIROSTRIX15","race":"G3 Human Female","dna":[{"dnaType":"DynamicUMADna","dnaTypeHash":1673940569,"packedDna":"{\"bDnaAsset\":{\"instanceID\":38920},\"bDnaAssetName\":\"G3HF DynamicUMADnaAsset\",\"bDnaSettings\":[{\"name\":\"BodyDetails\",\"value\":128},{\"name\":\"BodySize\",\"value\":128},{\"name\":\"BodyBulk\",\"value\":128},{\"name\":\"BodyThickness\",\"value\":128},{\"name\":\"BodyHeight\",\"value\":128},{\"name\":\"BodyAnna\",\"value\":128},{\"name\":\"BodyBriley\",\"value\":128},{\"name\":\"BodyCathy\",\"value\":128},{\"name\":\"BodyClarice\",\"value\":128},{\"name\":\"BodyFilia\",\"value\":128},{\"name\":\"BodyGia\",\"value\":128},{\"name\":\"BodyIrelia\",\"value\":128},{\"name\":\"BodyJazmine\",\"value\":128},{\"name\":\"BodyLaura\",\"value\":128},{\"name\":\"BodyLindsey\",\"value\":128},{\"name\":\"BodyMonique\",\"value\":128},{\"name\":\"BodySenna\",\"value\":128},{\"name\":\"BodySunny\",\"value\":128},{\"name\":\"BodyTisha\",\"value\":128},{\"name\":\"BodyUma\",\"value\":128},{\"name\":\"HeadAnna\",\"value\":128},{\"name\":\"HeadBriley\",\"value\":128},{\"name\":\"HeadCathy\",\"value\":128},{\"name\":\"HeadClarice\",\"value\":128},{\"name\":\"HeadFilia\",\"value\":128},{\"name\":\"HeadGia\",\"value\":128},{\"name\":\"HeadIrelia\",\"value\":128},{\"name\":\"HeadJazmine\",\"value\":128},{\"name\":\"HeadLaura\",\"value\":128},{\"name\":\"HeadLindsey\",\"value\":128},{\"name\":\"HeadMonique\",\"value\":128},{\"name\":\"HeadSenna\",\"value\":128},{\"name\":\"HeadSunny\",\"value\":128},{\"name\":\"HeadTisha\",\"value\":128},{\"name\":\"HeadUMA\",\"value\":128},{\"name\":\"BreastSmall\",\"value\":128},{\"name\":\"BreastLarge\",\"value\":128},{\"name\":\"NipplesLength\",\"value\":128},{\"name\":\"NipplesSize\",\"value\":128},{\"name\":\"AreolaSize\",\"value\":128},{\"name\":\"GluteSize\",\"value\":128},{\"name\":\"HipSize\",\"value\":128},{\"name\":\"HeadElfEars\",\"value\":128},{\"name\":\"HeadSize\",\"value\":128}]}"}],"characterColors":[{"name":"Skin","colors":[240,210,159,255,0,0,0,0,255,255,255,255,0,0,0,0,255,255,255,255,0,0,0,0]},{"name":"Hair","colors":[50,30,2,255,0,0,0,0,255,255,255,255,0,0,0,0,255,255,255,255,0,0,0,0]},{"name":"Eyes","colors":[10,11,165,255,0,0,0,0,255,255,255,255,0,0,0,0,255,255,255,255,0,0,0,0]}],"wardrobeSet":[{"slot":"Hair","recipe":"G3F ShortToulouse Hair"},{"slot":"WardrobeCollection","recipe":"G3F JG_FullOutfit"}],"raceAnimatorController":"G3F AnimationCntrlr"}


Richard MacCutchan

Я понятия не имею, что такое UMA-фреймворк и что вы на самом деле пытаетесь сделать.

Member 7995828

Спасибо, что нашли время помочь мне.
Мне нужно сохранить эту информацию в файл, и я не хочу, чтобы игроки могли напрямую изменять эту информацию.
Я устал использовать binaryformatter для сериализации файла, но он все еще был доступен для редактирования.
Я пытаюсь зашифровать информацию перед сохранением файла.

Richard MacCutchan

"Я устал использовать binaryformatter для сериализации файла, но он все еще был доступен для редактирования.Как я уже говорил вам вчера, binaryFormatter просто запишет те же данные, это ничего не изменит.

Рейтинг:
1

OriginalGriff

Используйте отладчик, чтобы точно посмотреть, что происходит: наиболее вероятная причина заключается в том, что GetCurrentRecipe возвращает пустую строку, но мы не можем проверить это для вас - отладчик может показать вам точно, что он возвращает, и это важно. Также возможно, что ваш класс FileUtils не работает должным образом eiterh, и у нас тоже нет доступа к нему.

Но... зачем ты все это делаешь?
Все, что вам нужно, это:

characterRecipe = dcAvatar.GetCurrentRecipe();
using (Stream recipeFileStream = File.Open(charRecipeFilePath, FileMode.Create))
{
    binaryFormatter.Serialize(recipeFileStream, characterRecipe);
}