公共类 - “因其保护级别而无法访问。只能处理公共类型。”

19

我正在做一个测试项目来学习有关对象的XML序列化,但是我遇到了一个奇怪的运行时错误:

namespace SerializeTest
{

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {

    }



    private void serializeConnection(Conn connection)
    {
        XmlSerializer serializer = new XmlSerializer(typeof(Conn));
        TextWriter textWriter = new StreamWriter(@"serialized.xml");
        serializer.Serialize(textWriter, connection);
        textWriter.Close();
    }

    static List<Conn> deserializeConnection()
    {
        XmlSerializer deserializer = new XmlSerializer(typeof(List<Conn>));
        TextReader textReader = new StreamReader(@"serialized.xml");
        List<Conn> connectionList;
        connectionList = (List<Conn>)deserializer.Deserialize(textReader);
        textReader.Close();

        return connectionList;
    }

    private void btnSerialize_Click(object sender, EventArgs e)
    {
        Conn conn = getConnection();
        serializeConnection(conn);

    }

    private Conn getConnection()
    {
        Conn connection = new Conn();
        connection.connectionName = txtName.Text;
        connection.address = txtAddress.Text;
        connection.height = 2542;
        connection.width = 4254;
        connection.password = txtPassword.Text;
        connection.smartSizing = false;
        connection.username = txtUsername.Text;
        connection.port = 474;
        return connection;
    }

    private void btnDeserialize_Click(object sender, EventArgs e)
    {
        int count = deserializeConnection().Count;
        lblStatus.Text = "Count: " + count;
    }
}

class Conn
{
    public Conn()
    {
    }
    public string connectionName { get; set; }
    public int height { get; set; }
    public int width { get; set; }
    public string address { get; set; }
    public string username { get; set; }
    public string password { get; set; }
    public int port { get; set; }
    public bool smartSizing { get; set; }
}

}

这个类是公共的 - 我不明白什么可能会导致这个错误。希望能得到帮助。

1个回答

45

这个类是公共的

不是的。这是声明:

class Conn
{
    ...
}

你没有指定任何访问修饰符,所以它默认为internal(假设它不是嵌套的)。仅仅因为它有一个公共构造函数并不意味着它是公共的。你需要明确地将它设置为公共:

public class Conn
{
    ...
}

抱歉,我以为类的可见性是由构造函数的可见性决定的。谢谢Jon。 - Thad Blankenship
8
@ThadBlankenship:不需要道歉 - 这意味着你学到了东西 :) - Jon Skeet
但是要确保,Conn不与Form在同一个命名空间中,对吗? - MBen
2
@MBen:这有什么关系呢?命名空间与可访问性完全无关 - 而且在这种情况下,抱怨的是序列化 - Jon Skeet
类可见性的另一个决定因素是嵌套性;嵌套的类是私有的。在某些情况下,即使在外部类中使用,这样的类也必须明确标记为公共类! - David A. Gray
@DavidA.Gray:您总是可以在包含类中引用嵌套类。但是,如果要在公共方法的签名中引用它,则必须将其也设置为公共。 - Jon Skeet

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