网络 > csharp AOT中的XML序列化
2025-04-02
玩具项目引入序列化后,开始体会到CSharp的AOT的蛋疼了。所以也明白CSharp之父做的TSChekcer为啥要用golang不用csharp了。
两门语言对待AOT的优先级上的确不同,CSharp的AOT只是能用,绝对不是优势。
实现,CSharp开启AOT后,反射的功能就开始受限,这对于序列化的影响很大,解决方案是必须显示的指定可能用到的类。
第一个会出现的错误是,报找不到空参数构造函数。
---> System.InvalidOperationException: HellMapManager.Models.Map cannot be serialized because it does not have a parameterless constructor.
本质是因为没有指定可能使用的类型(以及子类中可能没指定)。
需要引入
using System.Diagnostics.CodeAnalysis;
然后在类定义中显示的指明
public partial class Map
{
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(Map))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(MapInfo))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(Alias))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(Room))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(Exit))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(Route))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(Variable))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(Landmark))]
然后可能遇到的问题是提示
---> System.InvalidOperationException: You must implement a default accessor on System.Collections.Generic.List`1[[HellMapManager.Models.Room, HellMapManager, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]] because it inherits from ICollection.
这是需要在使用XML元素的地方显式指定类型
[XmlArray(ElementName = "Rooms")]
[XmlArrayItem(typeof(Room))]
public List<Room> Rooms { get; set; } = [];
继续写,继续踩坑。
代码 > 上手avaloniaui初体验
2025-03-28
在不需要行动力的地方,我行动力总是高的可怕。
找了个需求出来,开始做avaloniaui项目。
怎么说呢,对于vscode的支持一般,和vscode下的flutter体验完全不能比。
csharp本身语法糖有点多,少用点糖就行,Dart也算照着csharp一顿猛抄,所以上首速度还挺快。
axaml个是,也就是学xaml,用xml布局做画面的,和flutter的用代码写组件的体验完全不能比,总觉得丹疼的紧,也没有Vue那么丰富的模板语法。
AOT的话本身体验还行。裁减或打包出来的文件也不多,和flutter桌面版那一家老小一起出游的感觉不同。
继续写写,再体会体会。
代码 > 粗读了一遍C#图解教程
2025-01-24
既然决定要搞C#,那么在节前花了点时间找了个教程粗读了遍。
跳过了短期肯定不会去用的反射,粗看了泛型,其他的仔细过了编。
怎么说呢,csharp到底是这么多年的老语言了,语法层面,不说和C类语言的共通性,真的优点其实也被别的语言抄的差不多了。至少我在脑子里不停的在想:这个Flutter(Dart)抄过了,这个Flutter(Dart)也抄过了。
至于剩下的,没抄过的,至少在我这个一向推行使用多种编程语言的人来看,是在是只适合特殊场景,不值得抄。
对,我说的就是看到很多人吹的委托/事件和Linq。
委托和事件,在某些业务里的确重要,但作为一个通用语言来看的话,这么高优先级优点没必要。
至于Linq,看着那和SQL类似的语句,我只能说,恩,真牛逼,可我真用不上……
读完了,再招点资料和说明,准备开始写了。
代码 > 2025技术栈整理
2025-01-09
整理下自己手头的技术栈
1.golang
这个没的说,的确好用。
可以取代php/python/各种脚本
基本是个 可编译 强类型 基础库强大 的脚本语言。
特别时map和slice,太脚本化了。
能取代大部份使用脚本语言的场景
2.javascript
这个没得说,浏览器里大量使用,各个语言也有成熟的vm可以使用。至于TS,感觉不太适合我用的场景,绝大部分情况下,脚本语言对我只是胶水或者可配置逻辑,实际复杂应用还是走go
3.vue2
等到vue2什么时候停止更新了,再找新的前端框架吧。别的前端框架,哪怕vue3,都太重了,脱离了我对前端的需求
4.flutter/dart
对于一个熟悉前端,不经常写app的人来说,flutter太好用了。dart基本就时一个js,大部份场景下也有很多现成的flutter插件,各种云厂商的支持sdk也很多。随便捏一捏就能弄个app上架了,比较适合我的需求场景。android/ios原生开发实在离我太远,没必要
5.avaloniaui/c sharp
怎么说呢,flutter的确很好用,但再有些场合,太移动端为主,未毕合适。而且c sharp背后有微软在,各个领域未必时第一,但前三的解决方案总有。而且要说实话,golang太脚本化,很多场景c sharp可能会更好用一点。现在dotnet的linux支持看起来也不错,算是今年的研究反向了。20年前最火的时候没学,20年后再去学,也满有意思的。
其他的能看懂就行的语言
php:实在用途狭窄了
python:大部份场景不如用golang,能改改别人的python脚本就行了
lua:这个,实在,太不好用
java:能看懂就行,实在不想学
c:万物离不开C,总有可能要做ffi的
代码 > 试了下avaloniaui
2025-01-08
今天发现avaloniaui支持vscode了。
再本地跑了下,在linux应该说能用,但开发体验和vscode的flutter天差地别,只能说能用罢了。
考虑今年空下的时间搞搞看.net
不求多熟悉,能谢谢最基本的工具就行。
背景有微软这个大山在,各种生态还是不愁的。
至于投入太多精力么,也不至于,毕竟普通人还是跟不上微软的思路的。
代码 > 被向日葵折腾的不行
2024-09-18
我有个专门放国产软件的虚拟机,向日葵就是里面的一员大将。
前两天连线必须升级,升级玩重启后,好家伙,鼠标点击失效了。
推测是向日葵默认开启被控,接管鼠标操作造成的。
没办法,不停的进安全模式(msconfig关启动和服务)切换,还是不行。
更搞笑的是,鼠标失效后,向日葵还无法反安装。因为反安装界面那两个按钮是画上去的,tab切换不到。
大写的服。
先试试能不能用企业版的监控端吧。
不行就用了就删。
给国产软件虚拟机运行是最正确的选择。
网络 > 试了下cf的saas功能
2024-07-23
挺,好玩的。
总的来说,cf提供一个反代服务,通过这个反代服务可以让不托管在cf的域名也能享受cf的cdn/waf。还能玩玩优选ip啥的。
好像每天有10w次的限额。
这就很大善人……
杂言碎语 > 开始逐渐把飞书作为整理思路的工具
2024-07-15
一致以来,有在纸上图图画画整理思路的习惯。
其实这属于笔记软件的范畴。但是呢,Onenotes国内访问太蛋疼的。国内的笔记软件格局也不大。
现在习惯把信息更新在飞书上。毕竟各端都有支持(企微只不支持linux),口碑也还行。