Inhaltsverzeichnis
一、问题重现
二、问题分析
三、解决方案一:通过控制属性反序列化顺序
四、解决方案二:将数据成员定义在字段上而不是属性上
总结
Heim Datenbank MySQL-Tutorial 一个关于解决序列化问题的编程技巧

一个关于解决序列化问题的编程技巧

Jun 07, 2016 pm 03:10 PM
um 序列化 Artikel 编程技巧 解决

在前一篇文章中我曾经说过,现在正在做一个小小的框架以实现采用统一的API实现对上下文(Context)信息的统一管理。这个框架同时支持Web和GUI应用,并支持跨线程传递和跨域传递(这里指在WCF服务调用中实现客户端到服务端隐式传递),以及对上下文项目(Cont

在前一篇文章中我曾经说过,现在正在做一个小小的框架以实现采用统一的API实现对上下文(Context)信息的统一管理。这个框架同时支持Web和GUI应用,并支持跨线程传递和跨域传递(这里指在WCF服务调用中实现客户端到服务端隐式传递),以及对上下文项目(ContextItem)的读写控制。关键就在于后面两个特性的支持上面,出现一个小小的关于序列化的问题。解决方案只需要改动短短的一行代码,结果却让我折腾了老半天。

一、问题重现

为了重现我实际遇到的问题,我特意将问题简化,为此我写了一个简单的例子(你可以从这里下载)。在下面的代码片断中,我创建了一个名称为ContextItem的类型,代表一个需要维护的上下文项。由于需要在WCF服务调用实现自动传递,我将起定义成DataContract。ContextItem包含Key,Value和ReadOnly三个属性,不用说ReadOnly表示该ContextItem可以被修改。注意Value属性Set方法的定义——如果ReadOnly则抛出异常。

<span>   1:</span> [DataContract(Namespace = <span>"http://www.artech.com"</span>)]
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
<span>   2:</span> <span>public</span> <span>class</span> ContextItem
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
<span>   3:</span> {
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
<span>   4:</span>     <span>private</span> <span>object</span> <span>value</span> = <span>null</span>;
Nach dem Login kopieren
Nach dem Login kopieren
<span>   5:</span>     [DataMember]
Nach dem Login kopieren
<span>   6:</span>     <span>public</span> <span>string</span> Key { get; <span>private</span> set; }
Nach dem Login kopieren
<span>   7:</span>     [DataMember]
Nach dem Login kopieren
<span>   8:</span>     <span>public</span> <span>object</span> Value
Nach dem Login kopieren
<span>   9:</span>     {
Nach dem Login kopieren
<span>  10:</span>         get
Nach dem Login kopieren
<span>  11:</span>         {
Nach dem Login kopieren
<span>  12:</span>             <span>return</span> <span>this</span>.<span>value</span>;
Nach dem Login kopieren
<span>  13:</span>         }
Nach dem Login kopieren
<span>  14:</span>         set
Nach dem Login kopieren
<span>  15:</span>         {
Nach dem Login kopieren
<span>  16:</span>             <span>if</span> (<span>this</span>.ReadOnly)
Nach dem Login kopieren
<span>  17:</span>             {
Nach dem Login kopieren
<span>  18:</span>                 <span>throw</span> <span>new</span> InvalidOperationException(<span>"Cannot change the value of readonly context item."</span>);
Nach dem Login kopieren
<span>  19:</span>             }
Nach dem Login kopieren
<span>  20:</span>             <span>this</span>.<span>value</span> = <span>value</span>;
Nach dem Login kopieren
<span>  21:</span>         }
Nach dem Login kopieren
<span>  22:</span>     }
Nach dem Login kopieren
<span>  23:</span>     [DataMember]
Nach dem Login kopieren
<span>  24:</span>     <span>public</span> <span>bool</span> ReadOnly { get; set; }
Nach dem Login kopieren
<span>  25:</span>     <span>public</span> ContextItem(<span>string</span> key, <span>object</span> <span>value</span>)
Nach dem Login kopieren
<span>  26:</span>     {
Nach dem Login kopieren
<span>  27:</span>         <span>if</span> (<span>string</span>.IsNullOrEmpty(key))
Nach dem Login kopieren
<span>  28:</span>         {
Nach dem Login kopieren
<span>  29:</span>             <span>throw</span> <span>new</span> ArgumentNullException(<span>"key"</span>);
Nach dem Login kopieren
<span>  30:</span>         }
Nach dem Login kopieren
<span>  31:</span>         <span>this</span>.Key = key;
Nach dem Login kopieren
<span>  32:</span>         <span>this</span>.Value = <span>value</span>;
Nach dem Login kopieren
<span>  33:</span>     }
Nach dem Login kopieren
<span>  34:</span> }
Nach dem Login kopieren

为了演示序列化和反序列化,我写了如下两个静态的帮助方法。Serialize和Deserialize分别用于序列化和反序列化,前者将对象序列成成XML并保存到指定的文件中,后者则从文件读取XML并反序列化成相应的对象。

<span>   1:</span> <span>public</span> <span>static</span> T Deserialize<t>(<span>string</span> fileName)</t>
Nach dem Login kopieren
<span>   2:</span> {
Nach dem Login kopieren
Nach dem Login kopieren
<span>   3:</span>     DataContractSerializer serializer = <span>new</span> DataContractSerializer(<span>typeof</span>(T));
Nach dem Login kopieren
<span>   4:</span>     <span>using</span> (XmlReader reader = <span>new</span> XmlTextReader(fileName))
Nach dem Login kopieren
<span>   5:</span>     {
Nach dem Login kopieren
<span>   6:</span>         <span>return</span> (T)serializer.ReadObject(reader);
Nach dem Login kopieren
<span>   7:</span>     }
Nach dem Login kopieren
<span>   8:</span> }
Nach dem Login kopieren
<span>   9:</span>  
Nach dem Login kopieren
<span>  10:</span> <span>public</span> <span>static</span> <span>void</span> Serialize<t>(T instance, <span>string</span> fileName)</t>
Nach dem Login kopieren
<span>  11:</span> {
Nach dem Login kopieren
<span>  12:</span>     DataContractSerializer serializer = <span>new</span> DataContractSerializer(<span>typeof</span>(T));
Nach dem Login kopieren
<span>  13:</span>     <span>using</span> (XmlWriter writer = <span>new</span> XmlTextWriter(fileName, Encoding.UTF8))
Nach dem Login kopieren
<span>  14:</span>     {
Nach dem Login kopieren
<span>  15:</span>         serializer.WriteObject(writer, instance);
Nach dem Login kopieren
<span>  16:</span>     } 
Nach dem Login kopieren
<span>  17:</span>     Process.Start(fileName);
Nach dem Login kopieren
<span>  18:</span> }
Nach dem Login kopieren

我们的程序很简单。从如下的代码片断中,我们先创建一个ContextItem对象,然后将ReadOnly属性设置成true。然后调用Serialize方法将对象序列化成XML并保存在一个名称为context.xml的文件中。然后调用Deserialize方法,读取该文件进行反序列化。

<span>   1:</span> <span>static</span> <span>void</span> Main(<span>string</span>[] args)
Nach dem Login kopieren
<span>   2:</span> {
Nach dem Login kopieren
Nach dem Login kopieren
<span>   3:</span>     var contextItem1 = <span>new</span> ContextItem(<span>"__userId"</span>, <span>"Foo"</span>);
Nach dem Login kopieren
<span>   4:</span>     contextItem1.ReadOnly = <span>true</span>;
Nach dem Login kopieren
<span>   5:</span>     Serialize<contextitem>(contextItem1, <span>"context.xml"</span>);</contextitem>
Nach dem Login kopieren
<span>   6:</span>     var contextItem2 = Deserialize<contextitem>(<span>"context.xml"</span>);           </contextitem>
Nach dem Login kopieren
<span>   7:</span> }
Nach dem Login kopieren

序列化操作能够正常执行,但当程序执行到Deserialize的时候抛出如下一个InvalidOperationException异常。

一个关于解决序列化问题的编程技巧

二、问题分析

从上面给出的截图,我们不难看出,异常是在给ContextItem对象的Value属性赋值的时候抛出的。如果对DataContractSerializer序列化器的序列化/反序列化规则的有所了解的话,应该知道:对于数据契约(DataContract)基于属性(Property)的数据成员(DataMember),序列器在反序列化的时候是通过调用Set方法对其进行初始化的。在本例中,由于ReadOnly是True,在对Value进行反序列化的时候必然会调用Set方法。但是,只读的ContextItem却不能对其赋值,所以异常抛出。

那么,如何来解决这个问题呢?我最初的想法是这样:在序列化的时候将ReadOnly属性设置成False,然后添加另一个属性专门用于保存真实的值。在进行反序列的时候,由于ReadOnly为false,所以不会出现异常。当反序列化完成之后,在将ReadOnly的初始值赋上。虽然上述的方案能够解决问题,但是为此对ContextItem添加一个只在序列化和反序列化的过程中在有用的属性,总觉得很丑陋。

我们不妨换一种思路:异常产生于对Value属性凡序列化时发现ReadOnly非True的情况。那么怎样采用避免这种情况的发生呢?如果Value属性先于ReadOnly属性被序列化,那么ReadOnly的初始值就是False,这个问题不就解决了吗?这就是我们的第一个解决方案。

三、解决方案一:通过控制属性反序列化顺序

那么,如果控制那么属性先被反序列化,那么后被序列化呢?这就是要了解DataContractSerializer序列化器的序列化和发序列化规则了。在默认的情况下,DataContractSerializer是按照数据成员的名称的顺序进行序列化的。这可以从生成出来的XML的结构看出来。而XML元素的先后顺序决定了反序列化的顺序。

<span>   1:</span> <span><span>ContextItem</span> <span>xmlns:i</span><span>="http://www.w3.org/2001/XMLSchema-instance"</span> <span>xmlns</span><span>="http://www.artech.com"</span><span>></span></span>
Nach dem Login kopieren
<span>   2:</span>     <span><span>Key</span><span>></span>__userId<span></span><span>Key</span><span>></span></span>
Nach dem Login kopieren
<span>   3:</span>     <span><span>ReadOnly</span><span>></span>true<span></span><span>ReadOnly</span><span>></span></span>
Nach dem Login kopieren
<span>   4:</span>     <span><span>Value</span> <span>xmlns:d2p1</span><span>="http://www.w3.org/2001/XMLSchema"</span> <span>i:type</span><span>="d2p1:string"</span><span>></span>Foo<span></span><span>Value</span><span>></span></span>
Nach dem Login kopieren
<span>   5:</span> <span></span><span>ContextItem</span><span>></span>
Nach dem Login kopieren

在上面的例子中,ContextItem的ReadOnly排在Value的前面,会先被序列化。那么,是不是我们要更新Value或者ReadOnly的数据成员(DataMember,不是属性名称)呢?这肯定不是我们想要的解决方案。在SOA的世界中,DataMember是契约的一部分,往往是不容许更改的。

如果在不更改数据成员名称的前提下让属性Value先于ReadOnly被序列化,需要用到DataContractSerializer另一条反序列化规则:我们可以通过DataMemberAttribute特性的Order属性控制序列化后的属性在XML元素列表中的位置。

为此,我们有了答案,我们只需要将ContextItem稍加改动就可以了。在如下的代码中,在为Value和ReadOnly两个属性应用DataMemberAttribute的时候,将Order属性分别设置成1和2,这样就能使ContextItem对象在被序列化的时候,Value和ReadOnly属性对应的XML元素将永远会有前后之分。这里还需要注意的是,在Value属性的Set方法中,判断是否只读,采用的不是ReadOnly属性,而是对应的readonly字段。这一点非常重要,如果调用ReadOnly属性将会迫使该属性被反序列化。

<span>   1:</span> [DataContract(Namespace = <span>"http://www.artech.com"</span>)]
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
<span>   2:</span> <span>public</span> <span>class</span> ContextItem
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
<span>   3:</span> {
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
<span>   4:</span>     <span>private</span> <span>object</span> <span>value</span> = <span>null</span>;
Nach dem Login kopieren
Nach dem Login kopieren
<span>   5:</span>     <span>private</span> <span>bool</span> readOnly;
Nach dem Login kopieren
<span>   6:</span>     [DataMember]
Nach dem Login kopieren
<span>   7:</span>     <span>public</span> <span>string</span> Key { get; <span>private</span> set; }
Nach dem Login kopieren
<span>   8:</span>  
Nach dem Login kopieren
<span>   9:</span>     [DataMember(Order = 1)]
Nach dem Login kopieren
<span>  10:</span>     <span>public</span> <span>object</span> Value
Nach dem Login kopieren
<span>  11:</span>     {
Nach dem Login kopieren
<span>  12:</span>         get
Nach dem Login kopieren
<span>  13:</span>         {
Nach dem Login kopieren
<span>  14:</span>             <span>return</span> <span>this</span>.<span>value</span>;
Nach dem Login kopieren
<span>  15:</span>         }
Nach dem Login kopieren
<span>  16:</span>         set
Nach dem Login kopieren
<span>  17:</span>         {
Nach dem Login kopieren
<span>  18:</span>             <span>if</span> (<span>this</span>.readOnly)
Nach dem Login kopieren
<span>  19:</span>             {
Nach dem Login kopieren
<span>  20:</span>                 <span>throw</span> <span>new</span> InvalidOperationException(<span>"Cannot change the value of readonly context item."</span>);
Nach dem Login kopieren
<span>  21:</span>             }
Nach dem Login kopieren
<span>  22:</span>             <span>this</span>.<span>value</span> = <span>value</span>;
Nach dem Login kopieren
<span>  23:</span>         }
Nach dem Login kopieren
<span>  24:</span>     }
Nach dem Login kopieren
<span>  25:</span>     [DataMember(Order =2)]
Nach dem Login kopieren
<span>  26:</span>     <span>public</span> <span>bool</span> ReadOnly
Nach dem Login kopieren
<span>  27:</span>     {
Nach dem Login kopieren
<span>  28:</span>         get
Nach dem Login kopieren
<span>  29:</span>         {
Nach dem Login kopieren
<span>  30:</span>             <span>return</span> readOnly;
Nach dem Login kopieren
<span>  31:</span>         }
Nach dem Login kopieren
<span>  32:</span>         set
Nach dem Login kopieren
<span>  33:</span>         {
Nach dem Login kopieren
<span>  34:</span>             readOnly = <span>value</span>;
Nach dem Login kopieren
<span>  35:</span>         }
Nach dem Login kopieren
<span>  36:</span>     }
Nach dem Login kopieren
<span>  37:</span>     <span>//Others</span>
Nach dem Login kopieren
<span>  38:</span> }
Nach dem Login kopieren

有兴趣的读者可以亲自试试看,如果我们进行了如上的更改,前面的程序就能正常运行了。到这里,有的读者可以要问了,你不是说仅仅有一行代码的变化吗,我看上面改动的不止一行嘛。没有错,我们完全可以作更少的更改来解决问题。

四、解决方案二:将数据成员定义在字段上而不是属性上

我们再换一种思维,之所以出现异常是在反序列化的时候调用Value属性的Set方法所致。如果在反序列化的时候不调用这个方法不就得了吗?那么,如何才能避免对Value属性的Set方法的调用呢?方法很简单,那就是将数据成员定义在字段上,而不是属性上。基于属性的数据成员在反序列化的时候不得不通过调用Set方法对数据项进行初始化,而基于字段的数据成员在反序列化的时候只需要直接对其复制就可以了。

基于这样的思路,我们对原来的ContextItem进行简单的改动——将DataMemberAttribute特性从Value属性移到value字段上。需要注意的,为了符合于原来的Schema,需要将DataMemberAttribute特性的Name属性设置成“Value”。

<span>   1:</span> [DataContract(Namespace = <span>"http://www.artech.com"</span>)]
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
<span>   2:</span> <span>public</span> <span>class</span> ContextItem
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
<span>   3:</span> {
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
<span>   4:</span>     [DataMember]
Nach dem Login kopieren
<span>   5:</span>     <span>public</span> <span>string</span> Key { get; <span>private</span> set; }
Nach dem Login kopieren
<span>   6:</span>  
Nach dem Login kopieren
<span>   7:</span>     [DataMember(Name = <span>"Value"</span>)]
Nach dem Login kopieren
<span>   8:</span>     <span>private</span> <span>object</span> <span>value</span> = <span>null</span>;
Nach dem Login kopieren
<span>   9:</span>     <span>public</span> <span>object</span> Value
Nach dem Login kopieren
<span>  10:</span>     {
Nach dem Login kopieren
<span>  11:</span>         get
Nach dem Login kopieren
<span>  12:</span>         {
Nach dem Login kopieren
<span>  13:</span>             <span>return</span> <span>this</span>.<span>value</span>;
Nach dem Login kopieren
<span>  14:</span>         }
Nach dem Login kopieren
<span>  15:</span>         set
Nach dem Login kopieren
<span>  16:</span>         {
Nach dem Login kopieren
<span>  17:</span>             <span>if</span> (<span>this</span>.ReadOnly)
Nach dem Login kopieren
<span>  18:</span>             {
Nach dem Login kopieren
<span>  19:</span>                 <span>throw</span> <span>new</span> InvalidOperationException(<span>"Cannot change the value of readonly context item."</span>);
Nach dem Login kopieren
<span>  20:</span>             }
Nach dem Login kopieren
<span>  21:</span>             <span>this</span>.<span>value</span> = <span>value</span>;
Nach dem Login kopieren
<span>  22:</span>         }
Nach dem Login kopieren
<span>  23:</span>     }
Nach dem Login kopieren
<span>  24:</span>     [DataMember]
Nach dem Login kopieren
<span>  25:</span>     <span>public</span> <span>bool</span> ReadOnly { get; set; }     
Nach dem Login kopieren
<span>  26:</span>      <span>//Others</span>
Nach dem Login kopieren
<span>  27:</span>     }
Nach dem Login kopieren
<span>  28:</span> }
Nach dem Login kopieren

总结

虽然这仅仅是一个很小的问题,解决的方案看起来也是如此的简单。但是,这并不意味着这是一个可以被忽视的问题,背后隐藏对DataMemberAttribute序列化的序列化规则的理解。

作者:Artech
出处:http://artech.cnblogs.com

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Lösung für das Problem, dass das chinesische Sprachpaket nicht auf einem Win11-System installiert werden kann Lösung für das Problem, dass das chinesische Sprachpaket nicht auf einem Win11-System installiert werden kann Mar 09, 2024 am 09:48 AM

Lösung für das Problem, dass das Win11-System das chinesische Sprachpaket nicht installieren kann. Mit der Einführung des Windows 11-Systems begannen viele Benutzer, ihr Betriebssystem zu aktualisieren, um neue Funktionen und Schnittstellen zu nutzen. Einige Benutzer stellten jedoch fest, dass sie das chinesische Sprachpaket nach dem Upgrade nicht installieren konnten, was ihre Erfahrung beeinträchtigte. In diesem Artikel besprechen wir die Gründe, warum das Win11-System das chinesische Sprachpaket nicht installieren kann, und stellen einige Lösungen bereit, die Benutzern bei der Lösung dieses Problems helfen. Ursachenanalyse Lassen Sie uns zunächst die Unfähigkeit des Win11-Systems analysieren

Fünf Tipps, die Ihnen zeigen, wie Sie das Problem lösen können, dass sich das Black Shark-Telefon nicht einschaltet! Fünf Tipps, die Ihnen zeigen, wie Sie das Problem lösen können, dass sich das Black Shark-Telefon nicht einschaltet! Mar 24, 2024 pm 12:27 PM

Da sich die Smartphone-Technologie ständig weiterentwickelt, spielen Mobiltelefone eine immer wichtigere Rolle in unserem täglichen Leben. Als Flaggschiff-Telefon mit Schwerpunkt auf Spieleleistung erfreut sich das Black Shark-Telefon bei Spielern großer Beliebtheit. Manchmal sind wir jedoch auch mit der Situation konfrontiert, dass das Black Shark-Telefon nicht eingeschaltet werden kann. Zu diesem Zeitpunkt müssen wir einige Maßnahmen ergreifen, um dieses Problem zu lösen. Als Nächstes geben wir Ihnen fünf Tipps, wie Sie das Problem lösen können, dass sich das Black Shark-Telefon nicht einschaltet: Schritt 1: Überprüfen Sie zunächst die Akkuleistung. Stellen Sie zunächst sicher, dass Ihr Black Shark-Telefon über genügend Strom verfügt. Möglicherweise ist der Akku des Telefons leer

Der Treiber kann auf diesem Gerät nicht geladen werden. (Persönlich getestet und gültig) Der Treiber kann auf diesem Gerät nicht geladen werden. (Persönlich getestet und gültig) Mar 14, 2024 pm 09:00 PM

Jeder weiß, dass das Gerät möglicherweise nicht richtig funktioniert oder nicht richtig mit dem Computer interagiert, wenn der Computer den Treiber nicht laden kann. Wie lösen wir also das Problem, wenn auf dem Computer eine Meldung angezeigt wird, dass der Treiber auf diesem Gerät nicht geladen werden kann? Der unten stehende Editor zeigt Ihnen zwei Möglichkeiten, wie Sie das Problem einfach lösen können. Der Treiber kann auf diesem Gerät nicht geladen werden. Lösung 1. Suchen Sie im Startmenü nach „Kernel Isolation“. 2. Deaktivieren Sie die Speicherintegrität. Die Meldung oben lautet: „Die Speicherintegrität wurde deaktiviert. Ihr Gerät ist möglicherweise anfällig.“ Klicken Sie einfach darauf und ignorieren Sie es. 3. Das Problem kann nach einem Neustart der Maschine behoben werden.

Wie kann das Problem des automatischen Speicherns von Bildern beim Veröffentlichen auf Xiaohongshu gelöst werden? Wo ist das beim Posten automatisch gespeicherte Bild? Wie kann das Problem des automatischen Speicherns von Bildern beim Veröffentlichen auf Xiaohongshu gelöst werden? Wo ist das beim Posten automatisch gespeicherte Bild? Mar 22, 2024 am 08:06 AM

Durch die kontinuierliche Entwicklung der sozialen Medien ist Xiaohongshu zu einer Plattform für immer mehr junge Menschen geworden, auf der sie ihr Leben teilen und schöne Dinge entdecken können. Viele Benutzer haben beim Posten von Bildern Probleme mit der automatischen Speicherung. Wie kann man dieses Problem lösen? 1. Wie kann das Problem des automatischen Speicherns von Bildern beim Veröffentlichen auf Xiaohongshu gelöst werden? 1. Cache leeren Zuerst können wir versuchen, die Cache-Daten von Xiaohongshu zu löschen. Die Schritte sind wie folgt: (1) Öffnen Sie Xiaohongshu und klicken Sie auf die Schaltfläche „Mein“ in der unteren rechten Ecke. (2) Suchen Sie auf der persönlichen Center-Seite nach „Einstellungen“ und klicken Sie darauf. (3) Scrollen Sie nach unten und suchen Sie nach „; Option „Cache löschen“. Klicken Sie auf „OK“. Nachdem Sie den Cache geleert haben, geben Sie Xiaohongshu erneut ein und versuchen Sie, Bilder zu posten, um zu sehen, ob das Problem mit dem automatischen Speichern behoben ist. 2. Aktualisieren Sie die Xiaohongshu-Version, um sicherzustellen, dass Ihr Xiaohongshu

Wie kann ich Geld verdienen, indem ich heute Artikel auf Toutiao veröffentliche? Wie Sie noch heute mehr Einkommen erzielen, indem Sie Artikel auf Toutiao veröffentlichen! Wie kann ich Geld verdienen, indem ich heute Artikel auf Toutiao veröffentliche? Wie Sie noch heute mehr Einkommen erzielen, indem Sie Artikel auf Toutiao veröffentlichen! Mar 15, 2024 pm 04:13 PM

1. Wie können Sie heute Geld verdienen, indem Sie Artikel auf Toutiao veröffentlichen? Wie Sie noch heute mehr Einkommen erzielen, indem Sie Artikel auf Toutiao veröffentlichen! 1. Grundlegende Rechte und Interessen aktivieren: Originalartikel können durch Werbung Gewinne erzielen, und Videos müssen im horizontalen Bildschirmmodus original sein, um Gewinne zu erzielen. 2. Aktivieren Sie die Rechte von 100 Fans: Wenn die Anzahl der Fans 100 Fans oder mehr erreicht, können Sie Gewinne aus Mikroschlagzeilen, origineller Q&A-Erstellung und Q&A erzielen. 3. Bestehen Sie auf Originalwerken: Originalwerke umfassen Artikel, Mikroschlagzeilen, Fragen usw. und müssen mehr als 300 Wörter umfassen. Bitte beachten Sie, dass bei der Veröffentlichung rechtswidrig plagiierter Werke als Originalwerke Kreditpunkte abgezogen werden und ggf. auch Gewinne abgezogen werden. 4. Vertikalität: Wenn Sie Artikel in Berufsfeldern schreiben, können Sie nicht nach Belieben Artikel über verschiedene Fachgebiete hinweg schreiben. Sie werden keine entsprechenden Empfehlungen erhalten, Sie werden nicht in der Lage sein, die Professionalität und Verfeinerung Ihrer Arbeit zu erreichen, und es wird schwierig sein, Fans zu gewinnen und Leser. 5. Aktivität: hohe Aktivität,

Interpretation des Oracle-Fehlers 3114: Ursachen und Lösungen Interpretation des Oracle-Fehlers 3114: Ursachen und Lösungen Mar 08, 2024 pm 03:42 PM

Titel: Analyse des Oracle-Fehlers 3114: Ursachen und Lösungen Bei der Verwendung einer Oracle-Datenbank stoßen Sie häufig auf verschiedene Fehlercodes, unter denen Fehler 3114 am häufigsten vorkommt. Bei diesem Fehler handelt es sich im Allgemeinen um Datenbankverbindungsprobleme, die beim Zugriff auf die Datenbank zu Ausnahmen führen können. In diesem Artikel wird der Oracle-Fehler 3114 interpretiert, seine Ursachen erläutert und spezifische Methoden zur Behebung des Fehlers sowie zugehörige Codebeispiele vorgestellt. 1. Definition von Fehler 3114 Oracle-Fehler 3114 bestanden

So lösen Sie das Problem des niedrigen Tons auf Apple-Mobiltelefonen So lösen Sie das Problem des niedrigen Tons auf Apple-Mobiltelefonen Mar 08, 2024 pm 01:40 PM

Das Problem des niedrigen Tons bei Apple-Telefonen kann viele Ursachen haben. Benutzer können versuchen, das Problem zu lösen, indem sie die Lautstärkeeinstellungen anpassen, den Stummmodus überprüfen, die Lautsprecher und Ohrhörer ausschalten, das Telefon neu starten, die Kopfhörerbuchse überprüfen usw. So lösen Sie das Problem der geringen Lautstärke auf einem Apple-Mobiltelefon: 1. Passen Sie die Lautstärke an. Stellen Sie zunächst sicher, dass die Lautstärke Ihres Mobiltelefons richtig eingestellt ist. Sie können die Lautstärke erhöhen, indem Sie die Lautstärketaste drücken (normalerweise an der Seite des Telefons). Darüber hinaus können Sie in den Einstellungen auch die Lautstärke unter „Töne & Haptik“ oder „Töne & Haptisches Feedback“ anpassen. 2. Überprüfen Sie den Lautlosmodus, um sicherzustellen, dass sich Ihr Telefon nicht im Lautlosmodus befindet. Sie können nach dem Stummschalter neben den Lautstärketasten an der Seite suchen. Wenn der Stummschalter eingeschaltet ist, wird der Ton ausgeschaltet. 3. Reinigen Sie die Lautsprecher und Ohrhörer. Manchmal sind die Lautsprecher und Ohrhörer mit Staub bedeckt.

Sind Sie besorgt über verstümmelten WordPress-Backend-Code? Probieren Sie diese Lösungen aus Sind Sie besorgt über verstümmelten WordPress-Backend-Code? Probieren Sie diese Lösungen aus Mar 05, 2024 pm 09:27 PM

Sind Sie besorgt über verstümmelten WordPress-Backend-Code? Probieren Sie diese Lösungen aus, da spezifische Codebeispiele erforderlich sind. Mit der weit verbreiteten Anwendung von WordPress bei der Website-Erstellung kann es bei vielen Benutzern zu Problemen mit verstümmeltem Code im WordPress-Backend kommen. Ein solches Problem führt dazu, dass die Hintergrundverwaltungsoberfläche verstümmelte Zeichen anzeigt, was den Benutzern große Probleme bereitet. In diesem Artikel werden einige gängige Lösungen vorgestellt, die Benutzern helfen, das Problem verstümmelter Zeichen im WordPress-Backend zu lösen. Ändern Sie die Datei wp-config.php und öffnen Sie wp-config.

See all articles