System.Text.Encoding.GetString(byte[])'由于其保护级别而无法访问
本文关键字:保护 于其 访问 GetString Encoding Text byte System | 更新日期: 2023-09-27 18:04:23
我正在尝试使用silverlight 5和c#将对象转换为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; }
}
}
包含class的Main函数是:
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();
}
}
}
我猜silverlight没有超载,因为某种原因只需要byte[]
。
你只需要使用另一个过载,同时接受index
和count
。
var bytes = mem.ToArray();
return utf8.GetString(bytes, 0, bytes.Length);
FWIW GetString
内部以同样的方式调用另一个重载:)
说实话,这里最好的选择是使用StringWriter
,因为.NET string
是而不是直接映射到UTF-8(如果有的话,它实际上是UTF-16):
using(var writer = new StringWriter())
{
ser.Serialize(writer, objectToSerialize);
return writer.ToString();
}
这还具有避免所有数据的额外重复的性能优势(string
vs byte[]
)。
如果必须使用byte[]
版本,可以使用不同的重载来指定数组的边界。还要注意,传入底层缓冲区避免了数据的第三个副本(即内存流中的底层byte[]
,从ToArray()
返回的临时byte[]
,以及最终在string
中结束的数据)。
return utf8.GetString(mem.GetBuffer(), 0, (int)mem.Length);