相关疑难解决方法(0)

Serialize包含Dictionary成员的Class

扩展我之前的问题,我决定(de)序列化我的配置文件类,它运行得很好.

我现在想存储驱动器盘符映射关联数组(关键是驱动器号,值是网络路径)和使用都试过Dictionary,HybridDictionaryHashtable打电话时的这一点,但我总是得到下面的错误ConfigFile.Load()或者ConfigFile.Save():

反映类型'App.ConfigFile'时出错.[snip] System.NotSupportedException:无法序列化成员App.Configfile.mappedDrives [snip]

从我读过的词典和HashTables可以被序列化,所以我做错了什么?

[XmlRoot(ElementName="Config")]
public class ConfigFile
{
    public String guiPath { get; set; }
    public string configPath { get; set; }
    public Dictionary<string, string> mappedDrives = new Dictionary<string, string>();

    public Boolean Save(String filename)
    {
        using(var filestream = File.Open(filename, FileMode.OpenOrCreate,FileAccess.ReadWrite))
        {
            try
            {
                var serializer = new XmlSerializer(typeof(ConfigFile));
                serializer.Serialize(filestream, this);
                return true;
            } catch(Exception e) {
                MessageBox.Show(e.Message);
                return false;
            }
        }
    }

    public void addDrive(string …
Run Code Online (Sandbox Code Playgroud)

.net c# serialization dictionary

135
推荐指数
7
解决办法
15万
查看次数

mscorlib.XmlSerializers.DLL的FileNotFoundException,它不存在

我正在使用XmlSerializer来反序列化mscorelib.dll中的特定类型

XmlSerializer ser = new XmlSerializer( typeof( [.Net type in System] ) );
return ([.Net type in System]) ser.Deserialize( new StringReader( xmlValue ) );
Run Code Online (Sandbox Code Playgroud)

这会FileNotFoundException在加载程序集时抛出一个catch :

"无法加载文件或程序集'mscorlib.XmlSerializers,Version = 2.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089'或其中一个依赖项.系统找不到指定的文件."

FusionLog:

=== Pre-bind state information ===
LOG: User = ###
LOG: DisplayName = mscorlib.XmlSerializers, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=x86
 (Fully-specified)
LOG: Appbase = file:///C:/localdir
LOG: Initial PrivatePath = NULL
Calling assembly : System.Xml, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089.
===
LOG: This bind starts in default load context.
LOG: …
Run Code Online (Sandbox Code Playgroud)

.net c# serialization assemblies

12
推荐指数
1
解决办法
2万
查看次数

通过Web服务在自定义对象中序列化名称/值对

这是一个非常复杂的问题,涉及如何在数据不是强类型时通过Web服务调用序列化数据.我会尝试尽可能地将它列出来.

样本存储对象:

[Serializable]
public class StorageObject {
  public string Name { get; set; }
  public string Birthday { get; set; }
  public List<NameValuePairs> OtherInfo { get; set; }  
}
[Serializable]   
public class NameValuePairs {
  public string Name { get; set; }
  public string Value { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

样品使用:

[WebMethod]
    public List<StorageObject> GetStorageObjects() {
      List<StorageObject> o = new List<StorageObject>() {
        new StorageObject() { 
          Name = "Matthew",
          Birthday = "Jan 1st, 2008", 
          OtherInfo = new List<NameValuePairs>() {
            new NameValuePairs() { …
Run Code Online (Sandbox Code Playgroud)

php c# serialization web-services class-design

7
推荐指数
1
解决办法
1万
查看次数

加载程序集而不锁定文件并保留正确的绑定上下文

我已经克服了一个令人生畏的难题.这是我的情况:

我正在使用插件框架构建应用程序.有一个基本插件类,所有插件都必须扩展.在同一个程序集中,我有一个帮助程序类,它将序列化和反序列化类.它是一个通用类,它遍布各处.结构是这样的:

MyApp.dll
|_ App.cs
|_ HelperCollection.cs
|_ PluginBase.cs

MyPlugin.dll
|_MyPlugin.cs (this extends PluginBase)
|_Foo.cs
Run Code Online (Sandbox Code Playgroud)

问题

我的问题是程序集加载和锁定文件.该应用程序的一个要求是可以随时覆盖插件.如果是这样,他们需要重新加载.这似乎是加载程序集以使其不被锁定的最佳方式(也就是说,我可以在应用程序仍在运行时覆盖它或吹走)是这样的:

byte[] readAllBytes = File.ReadAllBytes("MyPlugin.dll");
Assembly assembly = Assembly.Load(readAllBytes);
Run Code Online (Sandbox Code Playgroud)

加载插件组件工作正常,没有问题.我从插件程序集中的MyPlugin.cs中得到一个例外,我试图使用它HelperCollection进行反序列化.一个例子可能是这样的:

// HelperCollection uses XmlSerializer under the covers
List<Foo> settingCollection = HelperCollection<Foo>.Deserialize("mysettings.xml");
Run Code Online (Sandbox Code Playgroud)

它正在爆炸并抛出一个InvalidCastException说法"Unable to cast object of type 'List[Foo]' to 'List[Foo]'".经过多次研究,我终于找到了原因.它被加载到LoadNeither绑定上下文中.

何时Foo加载(来自MyPlugin.dll)它位于LoadNeither绑定上下文中,而包含类型转换类型的程序集(在我的情况下,MyApp.dll)在Default上下文中加载.因此即使它们具有相同的名称,它们也不被认为是相同的类型.这是因为我正在使用它Assembly.Load(byte[]).

问题

我怎么能绕过这个?我怎么能够,

  1. 加载程序集而不是锁定文件,和
  2. 提供正确的绑定上下文,以便我可以转换位于已加载程序集中的对象.

对不起文本墙,只是想获得所有相关信息.

.net c# plugins assemblies assembly-loading

7
推荐指数
1
解决办法
5652
查看次数

类型xxxx不期望使用xmlinclude或soapinclude

我有一个关于这个序列化问题的奇怪案例 - 在本网站上已经多次询问过,我已经完成了一些问题并尝试了常用项目无济于事:

  • 将[XmlInclude]添加到抛出错误的类中
  • 删除名称空间
  • 为每个类添加不同的命名空间

为了进一步解释,我在下面提供了我的代码的简化版本.本质上我使用一个WebServiceHost对象来运行RESTful服务,我的一个端点返回一个序列化为XML的对象(我用对象[DataContract][DataMember]属性注释了对象).此对象包含SerializableDictionary<string, object>(此处)值已键入的值object.我相信这就是它失败的原因:

  • 在为值分配基元时,可以正常工作
  • 当我将自定义对象分配给KV对V时,我得到了意外的类型异常,可能是因为Serializer不知道如何对对象进行序列化/某种命名空间问题

显然,我无法用Objectcs注释[XmlInclude],因为它是一个服务,我不是自己序列化我不能使用类似的东西

new Serializer(typeof(...), new Type[] { ... }}
Run Code Online (Sandbox Code Playgroud)

我有什么想法可以做什么?我想过不要将dict值键入为对象,而是更具体但问题是这个值可以采用原语或cusotm类型.一些代码来解释上面的内容:

编辑:更新了以下代码,使其更加清晰

[DataContract]
public class ResponseObject
{
    [DataMember(Name = "data")]
    public SerializableDictionary<string, object> Data { get;set; }

    public ResponseObject()
    {
        Data = new SerializableDictionary<string, object>();
    }
}

...

var d1 = new ResponseObject();
d1.Data.Add("some key", "some value"); //WORKS AND SERIALIZES PERFECLTY

var d2 = new …
Run Code Online (Sandbox Code Playgroud)

c# xml rest serialization

7
推荐指数
1
解决办法
2万
查看次数

将对象集合导出到XML文件

使用C#...我有一个小应用程序,它可以从类中创建对象,并将其添加到对象集合中,并且在显示集合中当前所选对象的某些值的过程中会做一些UI事情(使用WPF UI) 。因此,我想添加一种功能,使用户可以将其对象集合保存到文件中,以便下次运行应用程序时可以将其加载回去。

我猜想XML是一种显而易见的方法,但我对如何做一无所知。因此,如何将对象的集合导出或转储到xml文件,然后,也许更重要的是,然后我将如何将该XML文件读回我的应用程序以重新创建集合?

这是该应用程序的屏幕截图

c# xml collections export

5
推荐指数
1
解决办法
2万
查看次数

在.NET中Xml序列化失败的场景

我想知道在.NET中xml序列化可能失败的最常见情况.

.net c# xml-serialization

5
推荐指数
1
解决办法
1662
查看次数

将字典序列化到磁盘?

我们有一个Hashtable(特别是C#Dictionary类),它可以保存数千/数百万(Key,Value)对,用于近O(1)搜索命中/未命中.

我们希望能够将此数据结构刷新到磁盘(序列化)并稍后再次加载(反序列化),以便保留Dictionary的内部哈希表.

我们现在做的是:

  1. 从磁盘加载=> List<KVEntity>.(KVEntity可序列化.我们使用Avro进行序列化 - 如果需要可以删除Avro)
  2. KVEntity从array =>字典中读取每一个.这将重新生成字典/散列表内部状态.
  3. <系统运行,字典可以增长/缩小/改变值等>
  4. 保存时,从字典读入数组(通过myKVDict.Values.SelectMany(x => x)新的List<KVEntity>)
  5. 我们将array(List<KVEntity>)序列化为磁盘以保存原始数据

请注意,在我们的保存/恢复期间,我们会丢失内部tashtable /字典状态,并且每次都必须重建它.

我们想直接序列化到/来自Dictionary(包括它的内部"实时"状态),而不是仅仅为磁盘i/o使用中间数组.我们怎么做?

一些伪代码:

// The actual "node" that has information. Both myKey and myValue have actual data work storing
public class KVEntity
{
    public string myKey {get;set;}
    public DataClass myValue {get;set;}
}

// unit of disk IO/serialization
public List<KVEntity> myKVList {get;set;} 

// unit of run time processing. The string key is …
Run Code Online (Sandbox Code Playgroud)

c# serialization dictionary

1
推荐指数
1
解决办法
3755
查看次数