在 C# 中将 Session 中的 Byte[] 转换回 List<String>

Converting a Byte[] from a Session back to a List<String> in c#

我尝试通过将列表转换为字节[] 来在会话中保存列表。但是当我尝试将它转换回列表时,我只得到一些随机数。这是我可以保存其中包含语言的列表的唯一方法。

在我转换并保存在会话中的代码下方

   private void AllowedLanguages(Userdata User)
        {
            List<string> languages = new List<string>();            

            if (User.Deutsch == true) { languages.Add("Deutsch"); }
            if (User.Englisch == true) { languages.Add("Englisch"); }
            if (User.Französisch == true) { languages.Add("Französisch"); }
            if (User.Italienisch == true) { languages.Add("Italienisch"); }
            if (User.Japanisch == true) { languages.Add("Japanisch"); }
            if (User.Mandarin == true) { languages.Add("Mandarin"); }
            if (User.Polnisch == true) { languages.Add("Polnisch"); }
            if (User.Portugiesisch == true) { languages.Add("Portugiesisch"); }
            if (User.Spanisch == true) { languages.Add("Spanisch"); }

            byte[] LanguagesInBytes = languages
             .SelectMany(s => System.Text.Encoding.ASCII.GetBytes(s))
             .ToArray();

            HttpContext.Session.Set("AllowedLanguages", LanguagesInBytes);
        }

这是我尝试将其返回到 Arraylist 或任何其他类型的字符串列表中的代码

            var LanguagesByte = HttpContext.Session.Get("AllowedLanguages");

            for (int i = 0; i < LanguagesByte.Length; i++)
            {
                String str = new String(LanguagesByte[i].ToString());
                Languages.Add(str);
            }

列表在我将其转换回显示在页面上后应该看起来像以前一样。这是正确的方法还是我完全错了?

byte[] 集合上调用 .ToArray() 将 return 一个 byte[][](本质上是字节数组的数组)

第二部分已经结束,但您需要按以下方式进行更改。

这是将它从对象转换为字节[][]

var LanguagesByte = (byte[][])HttpContext.Session.Get("AllowedLanguages");

然后我们必须从每个数组中检索字符串,如下所示

for (int i = 0; i < LanguagesByte.Length; i++)
{
     String str = Encoding.ASCII.GetString(LanguagesByte[i]);
     Languages.Add(str);
}

您也可以使用 linq 来实现此目的

List<string> Languages = LanguageByte.Select(x => Encoding.ASCII.GetString(x)).ToList()

目前您正在将编码值排序为一个长字节数组,当您解码它们时您不知道它们从哪里开始或结束 - 所以如果您添加一个分隔符,您可以这样做:这里我'我使用 [=12=]:

byte[] LanguagesInBytes = languages
  .SelectMany(s => System.Text.Encoding.ASCII.GetBytes(s + "[=10=]"))
  .ToArray();

然后,解码它们:

List<string> output = new List<string>();
string language = string.Empty;
for (int i = 0; i < LanguagesInBytes.Length; i++) {
    var item = LanguagesInBytes[i];
    if (item == 0) {
        output.Add(language);
        language = string.Empty;
    }
    else {
        language += System.Text.Encoding.ASCII.GetString(new[] { item });
    }   
}

另请注意,将值存储为 Ascii 意味着像 ö 这样的扩展字符会在此过程中丢失。