【问题标题】:C# Error 'System.Text.Encoding.GetString(byte[])' is inaccessible due to its protection levelC# 错误“System.Text.Encoding.GetString(byte[])”由于其保护级别而无法访问
【发布时间】:2014-05-20 09:47:46
【问题描述】:

我正在尝试使用 silverlight 5 和 c# 将 Object 转换为 xml,但出现以下错误:

Error   1   'System.Text.Encoding.GetString(byte[])' is inaccessible due to its protection level    

对应行:

 return utf8.GetString(mem.ToArray());

在我的 Xml.cs 类中

using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Xml.Serialization;
using System.IO;
using System.Text;

namespace SliderLastTry
{
    public static class Xml
    {
        public static string ToXml(this object objectToSerialize)
        {
            var mem = new MemoryStream();
            var ser = new XmlSerializer(objectToSerialize.GetType());
            ser.Serialize(mem, objectToSerialize);
            var utf8 = new UTF8Encoding();
            return utf8.GetString(mem.ToArray());
        }
    }
}

Paramter.cs 是:

using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;

namespace SliderLastTry
{
    public  class Parameter 
    { 
        public  string Name {get; set; } 
    }  
}

包含类的主函数是:

using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;

namespace SliderLastTry
{
    public static class ControlClass
    {
        public static void Main()
        {
            Parameter pram = new Parameter();
            pram.ToXml();

        }

    }
}

有人可以帮我解决我的错误吗?

【问题讨论】:

  • 我在这里复制了你的代码,没有错误,不是在构建时,不是在执行时。
  • 我用的是silverlight5 c#是个问题。
  • 我不知道 Silverlight 上下文,我只是在使用控制台应用程序。

标签: c# .net serialization xml-serialization xmlserializer


【解决方案1】:

我猜silverlight没有overload,由于某种原因它只需要byte[]

您只需要使用another overload,它也需要indexcount

var bytes = mem.ToArray();
return utf8.GetString(bytes, 0, bytes.Length);

FWIW GetString 在内部以相同的方式调用另一个重载 :)

【讨论】:

    【解决方案2】:

    说实话,这里最好的选择实际上是使用 StringWriter,因为 .NET string 不是直接映射到 UTF-8(它实际上是 UTF-16,如果有的话):

    using(var writer = new StringWriter())
    {
        ser.Serialize(writer, objectToSerialize);
        return writer.ToString();
    }
    

    这还具有避免所有数据额外重复的性能优势(stringbyte[])。

    如果您必须使用byte[] 版本,您可以使用不同的重载来指定数组的边界。另请注意,传入底层缓冲区可避免数据的第三个重复(即内存流中的底层byte[]、从ToArray() 返回的临时byte[],以及以string 结尾)。

    return utf8.GetString(mem.GetBuffer(), 0, (int)mem.Length);
    

    【讨论】:

    • 非常感谢。你真是个xml专家。我有一个问题,假设我将这个 xml 打印在一个文件中。那么是否可以以格式化方式(而不是连续字符串)打印它?
    • @user234839 由XmlWriterSettings 类控制;要做到这一点,您还需要有一个XmlWriter;参见这里,例如:stackoverflow.com/q/5414617/23354 - 基本上,你会有一个由XmlWriter 包裹的StringWriter,然后让XmlSerializer 写入XmlWriter;见 MSDN:msdn.microsoft.com/en-us/library/…
    猜你喜欢
    • 1970-01-01
    • 2014-08-15
    • 2012-10-05
    • 1970-01-01
    • 2011-04-05
    • 1970-01-01
    • 2015-09-26
    • 2011-09-01
    相关资源
    最近更新 更多