我有一个里面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) 我正在使用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. …
我已经使用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
我正在努力与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)
提前谢谢,祝你有个愉快的一天.
我知道viewbag是一个随时可用的DynamicObject,但是如果你不在视图或控制器中,除了编写自己的DynamicObject之外还有其他任何即用型DynamicObject吗?
(顺便说一下,我找到了一个很棒的工具样本http://www.codeproject.com/KB/cs/dynamicincsharp.aspx)
我真的很懒,只想使用一些已经制作的DynamicObject.
只是尝试动态对象,我遇到了这个编译错误
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) 我想使用 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 字符串?
我有以下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不起作用.
好的,我正在尝试在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 …