将List<String>编码为普通字符串并解码回来的最简单方法是什么?

6

我认为我已经遇到过这种需求十几次了。但我从来没有找到令人满意的解决方案。例如,我有一组字符串,我想通过一个只允许纯字符串的通道(如磁盘或网络)进行序列化。

我几乎总是使用“split”和“join”,并使用类似于“:::==--==:::”这样荒谬的分隔符。

public static string encode(System.Collections.Generic.List<string> data)
{
    return string.Join(" :::==--==::: ", data.ToArray());
}
public static string[] decode(string encoded)
{
    return encoded.Split(new string[] { " :::==--==::: " }, StringSplitOptions.None);
}

但是这个简单的解决方案显然有一些缺陷。该字符串不能包含分隔符字符串。因此,编码后的字符串无法再次重新编码。
据我所知,全面的解决方案应该涉及在编码时转义分隔符,在解码时取消转义。虽然问题听起来很简单,但我相信完整的解决方案可能需要大量的代码。我想知道是否有任何技巧可以让我用非常少的代码构建编码器和解码器?
12个回答

0

在您的文件中包含System.Linq库,并将您的函数更改为以下内容:

    public static string encode(System.Collections.Generic.List<string> data, out string delimiter)
    {
        delimiter = ":";
        while(data.Contains(delimiter)) delimiter += ":";
        return string.Join(delimiter, data.ToArray());
    }
    public static string[] decode(string encoded, string delimiter)
    {
        return encoded.Split(new string[] { delimiter }, StringSplitOptions.None);
    }

那么分隔符将必须与消息一起嵌入吗? - Sake
是的,你可以将它与消息一起包含,这样就可以解码了。它解决了你提到的两个问题。 - undefined
如果一个字符串的结尾包含分隔符,例如:"abc:def" 或者仅仅是 "abc:",该怎么办? - Jacob Stanley
while语句检查字符串是否包含分隔符,并在找不到分隔符时对其进行修改。 - undefined

0

有很多文本标记语言可供选择,任何一种都可以“发挥作用”

鉴于您的输入简单,许多语言都可以轻松地发挥作用,这完全取决于:

  1. 您希望编码有多易读
  2. 它应该对 API 更改有多具有弹性
  3. 它有多容易解析
  4. 编写或获取解析器有多容易。

如果最后一个因素最重要,则只需使用 MS 为您提供的现有 XML 库:

class TrivialStringEncoder
{
    private readonly XmlSerializer ser = new XmlSerializer(typeof(string[]));

    public string Encode(IEnumerable<string> input)
    {
        using (var s = new StringWriter())
        {
            ser.Serialize(s, input.ToArray());
            return s.ToString();
        }       
    }

    public IEnumerable<string> Decode(string input)
    {
        using (var s = new StringReader(input))
        {
            return (string[])ser.Deserialize(s);            
        }       
    }

    public static void Main(string[] args)
    {
        var encoded = Encode(args);
        Console.WriteLine(encoded);
        var decoded = Decode(encoded);
        foreach(var x in decoded)
            Console.WriteLine(x);
    }
}

在输入“ A”,“<”,“>”上运行,您将获得(已编辑格式):
<?xml version="1.0" encoding="utf-16"?>
<ArrayOfString 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <string>A</string>
  <string>&lt;</string>
  <string>&gt;</string>
</ArrayOfString>
A
<
>

冗长、缓慢但极其简单,不需要额外的库


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接