我在Visual Studio 2005中工作并添加了一个文本文件,需要通过右键单击解决方案资源管理器中的项目进行解析并添加 - >新项目.这会将.txt文件放到项目文件夹中.debug .exe文件位于/ bin/debug文件夹中.
如何使用相对路径从代码中正确指向txt文件,该路径将正确解析为两个文件夹,同时在解决方案发布后也解析为位于同一文件夹中?
我正在尝试序列化一个对象,但我想排除其中的一个对象.我试过[NonSerialized]
,当我调用XmlSerializer
Cart对象时,它仍在尝试序列化它.
[Serializable]
[XmlRoot("Cart")]
public class Cart : ICart
{
// Public Properties
[DefaultValue("")]
public string ID { set; get; }
[XmlIgnore()]
[NonSerialized]
public CartSerializer Serializer = new CartSerializer(this);
}
Run Code Online (Sandbox Code Playgroud) 我无法使用System.Runtime.Serialization.Json.DataContractJsonSerializer
该类反序列化a中包含的DateTime实例List<object>
.我似乎无法将DateTime反序列化为原始类型.将DataContractJsonSerializer
始终反序列化到一个字符串类型的格式"/Date(1329159196126-0500)/"
.如果我通过使用强类型运行它,它将序列化和反序列化很好List<DateTime>
,但是我正在寻找方法让串行器在简单列表或数组中遇到时识别并正确反序列化DateTimes object
.
请注意,除了此列表将包含的基元和字符串之外,DateTimes是唯一的类型.这是我用来测试它的代码片段.
var list = new List<object> { 27, "foo bar", 12.34m, true, DateTime.Now };
var serializer = new DataContractJsonSerializer(typeof (List<object>));
using (MemoryStream ms = new MemoryStream())
{
serializer.WriteObject(ms, list);
ms.Position = 0;
var deserializedList = serializer.ReadObject(ms) as List<object>;
}
Run Code Online (Sandbox Code Playgroud) 我将我的类的一个实例序列化为一个文件(带有BinaryFormatter
)
之后,在另一个项目中,我想反序列化这个文件,但没有成功,因为我的新项目没有我旧类的描述。在.Deserialize()
收到一个异常
Unable to find assembly '*MyAssembly, Version=1.9.0.0, Culture=neutral, PublicKeyToken=null'.*".
Run Code Online (Sandbox Code Playgroud)
但是我有包含我想要反序列化的旧类的描述的程序集的 .DLL。
我不想在项目中添加对 this DLL 的引用(我希望能够反序列化任何类型程序集的类......)
如何通知序列化器/反序列化器使用我动态加载的程序集?
我有一个数据表whis只有一行,看起来像
America | Africa | Japan |
-------------------------------------------------------------
{"Id":1,"Title":"Ka"} | {"Id":2,"Title":"Sf"} | {"Id":3,"Title":"Ja","Values":{"ValID":4,"Type":"Okinawa"}}
Run Code Online (Sandbox Code Playgroud)
数据列是美国,非洲,日本
现在我想将数据表转换为JSon,使json看起来像
{
"America": {
"Id": 1,
"Title": "Ka"
},
"Africa": {
"Id": 2,
"Title": "Sf"
},
"Japan": {
"Id": 3,
"Title": "Ja",
"Values": {
"ValID": 4,
"Type": "Okinawa"
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的尝试是,
string js = JSonConvverter.Serializeobject(datatable);
var objType = JObject.Parse(js);
Run Code Online (Sandbox Code Playgroud)
但它没有用.
任何帮助将不胜感激.谢谢!
我有一个winforms树视图,我可以自动读取数据,(一个等于key的节点,里面的节点等于value),但是当读取对象类型时,它内部的值不会是对象的子节点节点(对象的键),(也许我无法解释,这是截图和我的方法.)
layer0需要在纹理内部,并且缩放需要在显示内部
我的Json:
{
"parent": "builtin/generated",
"textures": {
"layer0": "mm:items/iron_dust"
},
"display": {
"scale": [ 1.7, 1.7, 1.7 ]
}
}
Run Code Online (Sandbox Code Playgroud)
我自动检测的方法(实际上并非所有我的)
private void Form1_Load(object sender, EventArgs e)
{
StreamReader reader = new StreamReader(path);
string json = reader.ReadToEnd();
reader.Close();
JObject obj = JObject.Parse(json);
getAllProperties(obj);
}
void getAllProperties(JToken children)
{
TreeNode mainNode = treeView1.Nodes[0];
mainNode.Text = Path.GetFileNameWithoutExtension(path);
foreach (JToken child in children.Children())
{
var property = child as JProperty;
if (property != null)
{
if (property.Value.Type == JTokenType.String)
{
TreeNode keyNode …
Run Code Online (Sandbox Code Playgroud) 我有一个反序列化方法(用[OnDeserialized()]
属性修饰),我想在派生类中重写它.当我尝试这样做时,我收到以下运行时错误:
类型的未处理的异常"System.TypeLoadException" ....类型"BaseObj"在组件...具有方法"OnDeserialization",这是静态的,虚拟的,抽象的或通用的,但被标记为一个序列化回调方法.
我找不到任何确认序列化回调限制的文档(错误消息本身除外).有谁可以解释这个奇怪的限制?
根据这里的评论中的建议,我使用OnDeserialization方法调用一个单独的虚函数,如下所示:
[Serializable()]
public class BaseObj
{
protected string obj { get; set; }
[OnDeserialized()]
public void OnDeserializedMethod(StreamingContext context)
{
//call the virtual method because deserialization callbacks can’t be virtual
onDeserialized(context);
}
virtual protected void onDeserialized(StreamingContext context)
{
obj = "This value was deserialized by the base class.";
}
}
[Serializable()]
public class DerivedObj : BaseObj
{
override protected void onDeserialized(StreamingContext context)
{
obj = "This value was deserialized by the derived class."; …
Run Code Online (Sandbox Code Playgroud) 我正在从 .NET Core 3.0 应用程序迁移Newtonsoft.Json
到System.Text.Json
.NET Core 3.0 应用程序。
如何获得与配置System.Text.Json
为 .NET Core 2.2 应用程序时相同的行为?您可以找到此处描述的选项。Newtonsoft.Json
DefaultValueHandling = DefaultValueHandling.Ignore
DefaultValueHandling
概括
.NET Core 应用程序无法 XML 序列化包含枚举值的对象,而 .NET Framework (4.7.2) 成功。这是一个已知的重大更改,如果是,我该如何解决?
代码示例
以下控制台应用程序不会在 .NET Framework 4.7.2 项目中引发异常:
public enum MyEnum
{
One,
}
public class ValueContainer
{
public object Value;
}
class Program
{
static void Main(string[] args)
{
XmlSerializer newSerializer = XmlSerializer.FromTypes(
new[] { typeof(ValueContainer)})[0];
var instance = new ValueContainer();
instance.Value = MyEnum.One;
using (var memoryStream = new MemoryStream())
{
newSerializer.Serialize(memoryStream, instance);
}
}
}
Run Code Online (Sandbox Code Playgroud)
.NET Core 3.0 控制台应用程序中完全相同的代码在调用时抛出以下异常Serialize
:
System.InvalidOperationException
HResult=0x80131509
Message=There was an error generating the XML …
Run Code Online (Sandbox Code Playgroud) 使用 C# 8 的可空引用类型,我们可以编写(对于引用类型):
T x = ...;
T? y = x;
Run Code Online (Sandbox Code Playgroud)
但是,我无法理解多维和锯齿状数组的转换规则。
string[][] a = new string[1][];
string?[]?[] b = new string[1][];
string?[]?[]? c = new string[1][];
string?[,][] d = new string[1,2][];
string?[,][]? e = new string[1,2][];
string?[,]?[] f = new string[1,2][]; // compiler error
Run Code Online (Sandbox Code Playgroud)
最后一个例子给了我
错误 CS0029:无法将类型 'string[ , ][]' 隐式转换为 'string?[ , ]?[]'
既然它适用于锯齿状数组(请参阅 参考资料b
),为什么它不适用于多维数组呢?
R# 还告诉我
'c' 可以声明为不可空
string?[]?[]? c = new string[1][];
// ^ redundant
Run Code Online (Sandbox Code Playgroud)
我知道编译器可以证明它c
本身不为空,但我很困惑第三个?
是多余的。鉴于锯齿状数组是从左到右创建的(即new int[2][]
而不是 …
c# jagged-arrays multidimensional-array nullable-reference-types