不允许使用Go-yaml控制字符错误

时间:2015-11-15 08:30:58

标签: go yaml

我正在尝试制作一个非常简单的ssh地址簿程序。获取有关ssh地址的一些信息并将它们存储在yaml文档中。我正在做的部分是为了了解Go并且遇到一个小问题。我可以序列化数据并将文档放入文件中,但当我尝试将其读回时,我收到此错误:
<ImageView android:layout_width="150dp" android:layout_height="60dp" android:background="@drawable/frappesbutton2" android:id="@+id/imageView" android:layout_alignParentTop="true" android:layout_toLeftOf="@+id/buttonc2" android:layout_toStartOf="@+id/buttonc2" /> <ImageView android:layout_width="80dp" android:layout_height="80dp" android:src="@drawable/frapeonemarco2" android:layout_marginTop="21dp" android:id="@+id/imageView2" android:layout_below="@+id/imageView" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" /> <Button android:layout_width="80dp" android:layout_height="35dp" android:id="@+id/buttonc1" android:onClick="checkf1" android:text="@string/Check" android:layout_alignTop="@+id/imageView2" android:layout_toRightOf="@+id/imageView2" android:layout_toEndOf="@+id/imageView2" /> <Button android:layout_width="80dp" android:layout_height="35dp" android:id="@+id/buttonA1" android:onClick="addf1" android:text="@string/Add_it" android:layout_below="@+id/buttonc1" android:layout_alignLeft="@+id/buttonc1" android:layout_alignStart="@+id/buttonc1" /> <ImageView android:layout_width="80dp" android:layout_height="80dp" android:src="@drawable/frapeonemarco3" android:id="@+id/imageView3" android:layout_alignTop="@+id/buttonc1" android:layout_toRightOf="@+id/buttonc1" android:layout_toEndOf="@+id/buttonc1" /> <Button android:layout_width="80dp" android:layout_height="35dp" android:id="@+id/buttonc2" android:onClick="checkf2" android:text="@string/Check" android:layout_above="@+id/buttonA2" android:layout_alignLeft="@+id/buttonA2" android:layout_alignStart="@+id/buttonA2" /> <Button android:layout_width="80dp" android:layout_height="35dp" android:id="@+id/buttonA2" android:onClick="addf2" android:text="@string/Add_it" android:layout_below="@+id/buttonc1" android:layout_toRightOf="@+id/imageView3" android:layout_toEndOf="@+id/imageView3" /> <ImageView android:layout_width="80dp" android:layout_height="80dp" android:src= "@drawable/oreofrappe" android:layout_below="@+id/imageView2" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:layout_marginTop="37dp" android:id="@+id/imageView4" /> <Button android:layout_width="80dp" android:layout_height="35dp" android:id="@+id/buttonc3" android:onClick="checkf3" android:text="@string/Check" android:layout_alignTop="@+id/imageView4" android:layout_toLeftOf="@+id/imageView3" android:layout_toStartOf="@+id/imageView3" /> <Button android:layout_width="80dp" android:layout_height="35dp" android:id="@+id/buttonA3" android:onClick="addf3" android:text="@string/Add_it" android:layout_below="@+id/buttonc3" android:layout_toRightOf="@+id/imageView4" android:layout_toEndOf="@+id/imageView4" /> <ImageView android:layout_width="80dp" android:layout_height="80dp" android:src="@drawable/frappeoriginal3" android:layout_alignTop="@+id/buttonc3" android:layout_alignLeft="@+id/imageView3" android:layout_alignStart="@+id/imageView3" android:id="@+id/imageView5" /> <Button android:layout_width="80dp" android:layout_height="35dp" android:id="@+id/buttonc4" android:onClick="checkf4" android:text="@string/Check" android:layout_alignTop="@+id/imageView5" android:layout_toRightOf="@+id/imageView5" android:layout_toEndOf="@+id/imageView5" /> <Button android:layout_width="80dp" android:layout_height="35dp" android:id="@+id/buttonA4" android:onClick="addf4" android:text="@string/Add_it" android:layout_below="@+id/buttonc4" android:layout_toRightOf="@+id/imageView5" android:layout_toEndOf="@+id/imageView5" /> <ImageView android:layout_width="150dp" android:layout_height="60dp" android:background="@drawable/frappesbutton" android:layout_marginTop="22dp" android:id="@+id/imageView7" android:layout_below="@+id/imageView5" android:layout_alignRight="@+id/imageView5" android:layout_alignEnd="@+id/imageView5" /> <ImageView android:layout_width="80dp" android:layout_height="80dp" android:src="@drawable/firstcoffee" android:id="@+id/imageView6" android:layout_below="@+id/imageView7" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:layout_marginTop="27dp" /> <Button android:layout_width="80dp" android:layout_height="35dp" android:id="@+id/buttonc5" android:onClick="checkc1" android:text="@string/Check" android:layout_alignTop="@+id/imageView6" android:layout_toLeftOf="@+id/imageView5" android:layout_toStartOf="@+id/imageView5" /> <Button android:layout_width="80dp" android:layout_height="35dp" android:id="@+id/buttonA5" android:onClick="addc1" android:text="@string/Add_it" android:layout_below="@+id/buttonc5" android:layout_alignLeft="@+id/buttonc5" android:layout_alignStart="@+id/buttonc5" /> <ImageView android:layout_width="80dp" android:layout_height="80dp" android:src="@drawable/segundocafe" android:id="@+id/imageView8" android:layout_alignParentBottom="true" android:layout_toRightOf="@+id/buttonc5" android:layout_toEndOf="@+id/buttonc5" /> <Button android:layout_width="80dp" android:layout_height="35dp" android:id="@+id/buttonc6" android:onClick="checkc2" android:text="@string/Check" android:layout_alignBaseline="@+id/buttonc5" android:layout_alignBottom="@+id/buttonc5" android:layout_toRightOf="@+id/imageView7" android:layout_toEndOf="@+id/imageView7" /> <Button android:layout_width="80dp" android:layout_height="35dp" android:id="@+id/buttonA6" android:onClick="addc1" android:text="@string/Add_it" android:layout_below="@+id/buttonc5" android:layout_toRightOf="@+id/imageView7" android:layout_toEndOf="@+id/imageView7" /> </RelativeLayout>

我不确定此错误消息的含义,谷歌搜索没有产生任何有用的结果。有任何想法吗?

这些是我用来组织数据的结构:

yaml: control characters are not allowed

它将我的数据放入的格式是:

type EntriesList struct {
    SSHEntries []SSHEntry `yaml:"sshentries"`
}   

type SSHEntry struct {
    Name    string `yaml:"name"`
    Command SSHCmd `yaml:"command"`
}   

type SSHCmd struct {
    Addr  string `yaml:"addr"`
    Port  int    `yaml:"port"`
    Uname string `yaml:"uname"`
}   

我用YAML验证器检查了这个^^,它是合法的YAML。 这是我阅读文件的功能:

---
entrieslist:
 - name: entry1
   command:
     addr: somewhere
     port: 22
     uname: someone
 - name: entry2 ... etc 

2 个答案:

答案 0 :(得分:3)

想出来,问题是我的缓冲区太大了。如果你的[]字节太大,那么go-yaml会将那些额外的字节作为字符读出并抛出错误。我将代码更改为:

func readConf(CONF string) *EntriesList {
    confiFile, err := ioutil.ReadFile(CONF)
    check(err)
    var entries EntriesList
    err = yaml.Unmarshal(confiFile, &entries)
    check(err)
    return &entries
}

它按预期工作。

答案 1 :(得分:1)

从它的声音中,您在https://github.com/go-yaml/yaml/blob/53feefa2559fb8dfa8d81baad31be332c97d6c77/readerc.go#L347处遇到了错误阻止,看起来这也应该告诉您偏移量(文件中的位置会出现问题)字符)和字符代码。如果这些信息足以解决您的问题,那就太好了。另一方面,如果yaml库正在吐出经验证的yaml,它不习惯接受输入,那么你应该在https://github.com/go-yaml/yaml/issues

上打开Github上维护者的问题。