标签: dynamicobject

如何将动态对象序列化为 xml c#

我有一个里面object {System.Collections.Generic.List<object>}包含 1000 个object {DynamicData},每个有 4 个键和值,另一个List有 2 个键和值。我需要将这个对象序列化为一个 XML 文件,我尝试了正常的序列化,但它给了我这个异常 = The type DynamicData was not expected,我如何序列化这个对象?

这是代码:

           //output is the name of my object
            XmlSerializer xsSubmit = new XmlSerializer(output.GetType());
            var xml = "";

            using (var sww = new StringWriter())
            {
                using (XmlWriter writers = XmlWriter.Create(sww))
                {
                    try
                    {
                        xsSubmit.Serialize(writers, output);
                    }
                    catch (Exception ex)
                    {

                        throw;
                    }
                    xml = sww.ToString(); // Your XML
                }
            }
Run Code Online (Sandbox Code Playgroud)

我可以逐行和逐个元素地创建 xml 文件,但我想要更快、更少代码的东西。我的对象的结构是这样的:

output (count 1000) …
Run Code Online (Sandbox Code Playgroud)

c# xml xml-serialization xmlserializer dynamicobject

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

DynamicObject和TrySetMember性能与ExpandoObject性能

我正在使用DynamicObject的自定义实现,它非常适合我的应用程序,除了我遇到一些性能问题.在动态方面可以预期一些性能开销,但即使使用ExpandoObject,我也会看到显着的(读取:数量级)性能损失.

我不能使用ExpandoObject的原因是我想要覆盖它的一些行为.我把问题归结为下面一个非常简单的例子.

我的自定义ExpandoObject代码如下(简化为足以显示问题的代码) -

public class SuperExpando : DynamicObject
{
    public Dictionary<string, object> dictionary = new Dictionary<string, object>();
    public override bool TrySetMember(SetMemberBinder binder, object value)
    {
        dictionary[binder.Name] = value;
        return true;
    }
}

public dynamic m = new SuperExpando();
Run Code Online (Sandbox Code Playgroud)

当我在DynamicObject的字典直接设定值(iemdictionary ["键名"] = 500),那么我看到类似ExpandoObject,其是亚毫秒时间设置在字典中的密钥的值的性能.当我使用TrySetMember覆盖(iemkeyname = 500)时,我看到性能下降到30ms - 每个键值设置50ms.写入大量密钥时,这显然会成为一个问题.即使我一遍又一遍地写同一个密钥,通过TrySetMember访问它也需要相同的时间.

我的真实性能问题似乎与我使用动态的事实无关,因为它会影响TrySetMember.对于踢,我甚至评论了

dictionary[binder.Name] = value;
Run Code Online (Sandbox Code Playgroud)

在TrySetMember方法中,除了"return true;"之外什么都没有,而且性能是一样的.

如果我在SuperExpando类中添加如下内容 -

public override bool TryGetMember(GetMemberBinder binder, out object result)
{
    if (dictionary.ContainsKey(binder.Name))
    {
        result = dictionary[binder.Name];
        return true;
    }
    return false; 
}
Run Code Online (Sandbox Code Playgroud)

通过TryGetMember访问(读取)变量的性能问题是相同的,而直接读取字典提供了合理的性能.

有任何想法吗?

-BJ奎因

编辑:这是完整的示例代码.只需创建一个表单并在其上放置一个运行go_Click事件的按钮,并将您的项目设置为控制台应用程序.对我来说,在ExpandoObject中设置所有50个键需要大约30ms,而SuperExpando至少需要750ms. …

c# dynamic expandoobject dynamicobject

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

如何在Dynamic对象中使用Parallel.ForEach方法

我已经使用Parallel.ForEach功能来同时处理多个客户端,如下所示:

Clients objClient = new Clients();
List<Clients> objClientList = Clients.GetClientList();

Parallel.ForEach<Clients>(objClientList, list =>
{
    SendFilesToClient(list);
});
Run Code Online (Sandbox Code Playgroud)

但是现在,我没有创建Client类,而是决定动态创建客户端对象,如下所示:

var xDoc = XDocument.Load(new StreamReader(xmlPath + @"\client.xml"));
dynamic root = new ExpandoObject();

XmlToDynamic.Parse(root, xDoc.Elements().First());

dynamic clients = new List<dynamic>();

for (int i = 0; i < root.clients.client.Count; i++)
{
    clients.Add(new ExpandoObject());
    clients[i].Id = root.clients.client[i].id;
    clients[i].Name = root.clients.client[i].name;
    List<string> list = new List<string>();
    for (int j = 0; j < root.clients.client[i].emails.email.Count; j++)
    {
        list.Add(root.clients.client[i].emails.email[j].ToString());
    }
    clients[i].Email = string.Join(",", list);
}
Run Code Online (Sandbox Code Playgroud)

现在我不使用Client类并动态生成对象,如何使用Parallel.ForEach功能同时处理动态对象中的多个客户端,就像我以前使用类对象一样?

希望我清楚自己.

此外,如果您能告诉我我的方法是否有问题或者告诉我更好的方法,我将不胜感激.

c# parallel-processing .net-4.0 dynamicobject parallel.foreach

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

在java中读取动态json文件并合并它们

我正在努力与java中的json解析.
是否有可能在java中生成随机的,非标准化的json文件的表示?我试图使用gson,但我真的不明白是否以及如何可能.

所以jsonFile看起来像这样:

{ 
 "id":16875,
 "position":[1,2,5,7],
 "metadata":{
     "color":"blue",
     "id": "84779jh",
     "more":{ "some":"randomdata","absolutly":"noStructure"}
}
Run Code Online (Sandbox Code Playgroud)

任何键值对都是可能的,json文件可以嵌入尽可能多的深度.我需要得到类似java对象的东西才能将它与另一个json文件合并.我只需要元数据部分,其余部分可以忽略.

所以任何人都有任何想法,我怎么能做到这一点?我会很感激任何帮助:)

上面的json合并(这是父节点,所以我们保留他的id和位置,只是合并元数据)

  { 
   "id":16zut,
   "position":[1,2,5,7],
   "metadata":{
     "color":"green",
     "id": "84ergfujh",
     "more":{ 
        "some":"randomdata",
        "even":"more",
        "absolutly":"noStructure"
     },
     "tags":[1,2,3,4,6,8,f7,h,j,f]
   }
Run Code Online (Sandbox Code Playgroud)

将会:

  { 
   "id":16zut,
   "position":[1,2,5,7],
    "metadata":{
    "color":["blue", "green"],
    "id": ["84779jh","84ergfujh]",
    "more":{ "some":"randomdata","absolutly":"noStructure","even":"more"}
    "tags":[1,2,3,4,6,8,f7,h,j,f]
  }
Run Code Online (Sandbox Code Playgroud)

提前谢谢,祝你有个愉快的一天.

java random merge json dynamicobject

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

在C#中是否有任何Ready-to-use DynamicObject?

我知道viewbag是一个随时可用的DynamicObject,但是如果你不在视图或控制器中,除了编写自己的DynamicObject之外还有其他任何即用型DynamicObject吗?

(顺便说一下,我找到了一个很棒的工具样本http://www.codeproject.com/KB/cs/dynamicincsharp.aspx)

我真的很懒,只想使用一些已经制作的DynamicObject.

c# asp.net dynamicobject viewbag

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

无法为ExpandoObject指定值

只是尝试动态对象,我遇到了这个编译错误

ExpandoObject myObj = new ExpandoObject();
myObj.GivenName = "Testing";
Run Code Online (Sandbox Code Playgroud)

System.Dynamic.ExpandoObject'不包含'GivenName'的定义,并且没有扩展方法'GivenName'接受类型'System.Dynamic.ExpandoObject'的第一个参数'

看看MSDN:ExpandoObject,他们实际上做了不同的事情 - 使用dynamic关键字

dynamic myObj = new ExpandoObject();
myObj.GivenName = "Testing";
Run Code Online (Sandbox Code Playgroud)

对此有何解释?是否仍然可以在myObj不使用dynamic关键字的情况下为实例分配值?我看是否有.SetProperty但没有.

谢谢

更新

现在我明白我必须使用dynamic关键字,但如果允许使用该行则有什么用处

ExpandoObject myObj = new ExpandoObject();
Run Code Online (Sandbox Code Playgroud)

c# dynamicobject

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

如何将 List&lt;ExpandoObject&gt; 转换为 XML 字符串

我想使用 ExpandoObjects 列表作为 Telerik 报告的数据源,但 Telerik 报告目前似乎不支持此功能。他们确实支持将 XML 作为数据源,所以我试图将我的 ExpandoObjects 列表转换为 XML 字符串。

我已经看到(在Can I serialize an ExpandoObject in .NET 4?),可以通过 jsonFx 通过这个(VB.net 代码,而不是 c#)将单个 ExpandoObject 序列化为 XML 字符串:

dim XMLwriter As New JsonFx.Xml.XmlWriter
dim serializedExpando as string = XMLwriter.Write(obj)
Run Code Online (Sandbox Code Playgroud)

或其等效的 c# 代码:

JsonFx.Xml.XmlWriter XMLwriter = new JsonFx.Xml.XmlWriter();
String serializedExpando  = XMLwriter.Write(obj);
Run Code Online (Sandbox Code Playgroud)

如何将整个列表序列化为 XML 字符串?

c# xml telerik expandoobject dynamicobject

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

如何使用空属性名称调用对象属性?

我有以下JSON,我无法控制它,因为它来自外部API:

    {
  "user_id": "something_name",
  "devices": {
    "": {
      "sessions": [
        {
          "connections": [
            {
              "ip": "225.225.225.225",
              "user_agent": "something",
              "last_seen": 1504266816737
            }
        }
      ]
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我正在使用JSON反序列化器(JSON.Net)将其变为动态对象.

dynamic values = JsonConvert.DeserializeObject<dynamic>(mes);
Run Code Online (Sandbox Code Playgroud)

问题是,其中一个json键是一个空字符串"".现在我似乎无法像这样调用该属性:

values.devices.<the empty string part>.sessions.connections
Run Code Online (Sandbox Code Playgroud)

当其中一个顶键为空时,如何调用它下方的内容?做devices..sessions不起作用.

.net c# json json.net dynamicobject

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

动态TImage是动态TPanel的吗?

好的,我正在尝试在TScrollBox表面上创建一些自定义数量的TPanel,就像你可以在下面的图像上看到的那样.

在此输入图像描述

为了得到这个,我使用以下代码,并且工作正常.

var
  pan: array of TPanel;
  maxp, i, x, y: Integer;

...

maxp := 10;
SetLength(pan, maxp);

for i := 1 to maxp do begin
  // x is correct value; doesn't cause problem
  // y is correct value; doesn't cause problem
  pan[i-1] := TPanel.Create(form1);
  with pan[i-1] do begin
    Width := 100;
    Height := 150;
    Top := x * 151;
    Left := y * 101;
    Parent := ScrollBox1;
    end;
  end;
Run Code Online (Sandbox Code Playgroud)

现在,我有问题将TImage对象放在每个具有相同索引的TPanel中(img [0] - > pan [0],img [1] - > pan …

delphi runtime delphi-7 dynamicobject

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