klasse a deklariert mehrere json-felder
<p>ich habe eine klasse a, die einige private felder hat und die gleiche klasse erweitert eine andere klasse b, die auch einige private felder hat, die in klasse a sind.</p><pre><code>public class a extends b { private bigdecimal netamounttcy; private bigdecimal netamountpcy; private bigdecimal priceto; private string segment; private bigdecimal taxamounttcy; private bigdecimal taxamountpcy; private bigdecimal tradefeestcy; private bigdecimal tradefeespcy; // getter and setter for the above fields } </code></pre><p>und klasse b hat einige private fiedls, die in klasse a sind</p><p>wenn ich jetzt versuche, eine json-zeichenfolge aus der obigen klasse a zu erstellen, erhalte ich die folgende ausnahme:</p><pre><code>class com.hexgen.ro.request.a declares multiple json fields named netamountpcy </code></pre><p>wie kann man das beheben?</p><p>da es sich um private felder handelt, sollte es beim erstellen eines json-strings keine probleme geben, aber ich bin mir nicht sicher.</p><p>ich erstelle json-zeichenfolge wie folgt:</p><pre><code>gson gson = new gson(); tempjson = gson.tojson(obj); </code></pre><p>hier ist obj das objekt der klasse a</p>
<p><em>da es sich um private felder handelt, sollte es beim erstellen eines json-strings keine probleme geben.</em></p><p>ich glaube nicht, dass diese aussage zutrifft. gson prüft beim serialisieren die privaten felder des objekts, was bedeutet, dass alle privaten felder der oberklasse enthalten sind. wenn sie felder mit demselben namen haben, wird ein fehler ausgegeben.</p><p>wenn es ein bestimmtes feld gibt, das sie nicht einschließen möchten, müssen sie es mit dem schlüsselwort <code>transient</code> markieren, z.</p><pre><code>private transient bigdecimal tradefeespcy; </code></pre>
<p>wenn dies meine entwurfsentscheidung wäre, würde ich wahrscheinlich eher eine option c (modifizierte option a) wählen.</p><h3>erstens, warum nicht 'option b':</h3><p>zum einen gefällt mir die klarheit, dass jedes produkt seinen eigenen tisch hat. wenn es sich nur um eine große tabelle mit einem feld zur bestimmung des typs handelt, ist die beziehung nicht so klar.</p><p>zum anderen würde die indizierungsstrategie immer erfordern, dass dieses typfeld aufgelistet wird. da es sich nur um 4 typen handelt, ist die indexkardinalität extrem niedrig (<code>select * from product\_table where type='x'</code> führt im grunde sowieso einen vollständigen tabellenscan durch)</p><h3>option c.</h3><ul> <li>erstellen sie eine übergeordnete tabelle, die nur die spalten enthält, die alle typen gemeinsam nutzen</li> <li>erstellen sie jeden produkttyp als eigene tabelle mit ihren einzelnen spalten, mit einem zusätzlichen: ein link zur übergeordneten tabelle</li> <li>erstellen sie jede 'link'-tabelle: product\_option, model\_option usw. mit links zu den jeweiligen schlüsseln.</li> <li>für diejenigen mit wechselseitigen links (model\_option, option\_model) erstellen sie auch diese tabellen. dies erhöht die klarheit ihrer joins für alle, die sich das ansehen.</li> </ul><p>der nachteil ist die komplexität, sicherzustellen, dass waisen vermieden werden, wenn dinge aktualisiert/gelöscht werden, und zunächst die abfragen zu entwerfen, die diese tabellen verwenden.</p> Hallo.

  

 In deiner Lösung sind mehrere Dinge nicht ganz richtig. Zum einen ist kann mit deiner Lösung das leere Wort erzeugt werden. $S \rightarrow \lambda$!

  

 Außerdem ist nicht gesichert, dass die Wörter länger als 4 Zeichen sind. Deine Grammatik erzeugt z.B. auch die Wörter 0, 1, 011, 00 und viele andere. Damit ist zudem nicht gesichert dass das Wort mit 01 beginnt und endet.

  

 Wichtiger ist allerdings noch, dass du die Regeln für eine  rechtslineare Grammatik beachten musst!

  

 Zur Erinnerung: $P\_{rechtsnlinear} \subset N \times (T \cup TN \cup \{\lambda\})$

  

 Deine Regel $S \rightarrow 01S$ ist allerdings von der Form "$N \rightarrow TTN$"

  

 Liebe Grüße,

  

 Leonard <p>die standardmethode für die angabe des objekttyps ist entweder <a href="http://search.cpan.org/perldoc?perlfunc#ref"><code>ref</code></a> oder <a href="http://search.cpan.org/perldoc?scalar::util"><code>scalar::util</code></a> <code>::blessed</code>. wenn sie<em> wissen </em>das objekt gesegnet ist, geben sie dieselbe information zurück. </p><pre><code>my $class1 = blessed( $obj ); my $class2 = ref $obj; </code></pre><p><code>ref</code> gibt jedoch auch 'hash' für nicht gesegnete hashes zurück, während <code>blessed</code> dieses spiel ablehnt. </p><p>für eine liste von methoden ist es für den gesegneten zeigerstil eines perl-objekts einfach, eine davon selbst zu codieren. der folgende code funktioniert ziemlich gut für mich. es gibt die namen der funktionen (diejenigen, die den &quot;code-slot&quot; des angegebenen namens annehmen) zurück, die dem paket zugeordnet sind, das sie definiert. </p><pre><code>sub class\_methods { use class::isa; my $obj = shift; return unless ref( $obj ); my %meth\_names; foreach my $anc ( class::isa::self\_and\_super\_path( ref $obj ), 'universal' ) { my $stash = \%{"$anc\::"}; my @funcs = grep { m/^[\_\p{alpha}]/ # begins with \_ or alpha &amp;&amp; !exists $meth\_names{$\_} # no clobbering &amp;&amp; defined *{$stash-&gt;{$\_}}{code} # has a filled code slot } keys %$stash ; # assign to the "hash slice", keyed by all the entries in @funcs # the value of $anc repeated as many times as elements in @funcs. @meth\_names{@funcs} = ( $anc ) x @funcs; } return %meth\_names; } </code></pre><ul> <li><p>dies funktioniert auch für relativ komplexe objekte, aber wenn das besitzende paket eine menge generierten codes enthält, ist es nicht besonders hilfreich zu wissen, in welchem ​​paket die generatoren den code-pointer stecken. es wird mehr bedeuten, welches paket zu finden ist generiert den code. </p></li> <li><p>ist dies der fall, erhalten sie<em> might </em>den code aus der ausführung ihres codes, einschließlich <a href="http://search.cpan.org/perldoc?data::dumper"><code>data::dumper</code></a> und setzen von <code>$data::dumper::deparse</code> auf 1 wie folgt: (<code>local $data::dumper::deparse = 1;</code>) und dann den code-zeiger wie folgt: <code>say dumper( $code\_ref );</code></p></li> <li><p>es<em> won't </em>funktioniert für gültige methoden, die noch mit einer beliebigen <code>autoload</code>-methode erstellt werden müssen. wenn sie diese in der liste sehen, macht das objekt möglicherweise mehr, aber was es alles tut, wissen sie nicht.</p></li> <li><p>die &quot;basisklasse&quot; <code>universal</code> ist enthalten, da diese klasse verhalten enthält, das vom objekt verwendet werden kann. </p></li> </ul><p>viel glück.</p> <h2>moderne html5-techniken zum ändern von klassen</h2><p>moderne browser haben <a href="https://developer.mozilla.org/en-us/docs/dom/element.classlist"><strong>classlist</strong></a> hinzugefügt, das methoden zur verfügung stellt, mit denen klassen leichter ohne bibliotheken bearbeitet werden können:</p><pre><code>document.getelementbyid("myelement").classlist.add('myclass'); document.getelementbyid("myelement").classlist.remove('myclass'); if ( document.getelementbyid("myelement").classlist.contains('myclass') ) document.getelementbyid("myelement").classlist.toggle('myclass'); </code></pre><p>leider funktionieren diese in internet explorer vor version 10 nicht, obwohl es ein <a href="http://en.wikipedia.org/wiki/shim\_(computing)">shim</a> gibt, um die unterstützung für ie8 und ie9 hinzuzufügen, die unter <a href="https://developer.mozilla.org/en-us/docs/dom/element.classlist">diese seite</a> verfügbar ist. es wird jedoch immer mehr <a href="http://caniuse.com/#feat=classlist">unterstützt</a> .</p><h2>einfache browserübergreifende lösung</h2><p>die standard-javascript-methode zur auswahl eines elements ist <a href="https://developer.mozilla.org/en-us/docs/dom/document.getelementbyid"><code>document.getelementbyid("id")</code></a> . dies wird in den folgenden beispielen verwendet. sie können elemente natürlich auch auf andere weise erhalten. in der richtigen situation können sie stattdessen einfach <code>this</code> verwenden ins detail geht dies nicht in den rahmen der antwort.</p><h3>so ändern sie alle klassen für ein element:</h3><p>um alle vorhandenen klassen durch eine oder mehrere neue klassen zu ersetzen, legen sie das classname-attribut fest:</p><pre><code>document.getelementbyid("myelement").classname = "myclass"; </code></pre><p>(sie können eine durch leerzeichen getrennte liste verwenden, um mehrere klassen anzuwenden.)</p><h3>so fügen sie einem element eine zusätzliche klasse hinzu:</h3><p>um einem element eine klasse hinzuzufügen, ohne vorhandene werte zu entfernen/zu beeinflussen, fügen sie ein leerzeichen und den neuen klassennamen wie folgt hinzu:</p><pre><code>document.getelementbyid("myelement").classname += " myclass"; </code></pre><h3>so entfernen sie eine klasse aus einem element:</h3><p>um eine einzelne klasse zu einem element zu entfernen, ohne andere potenzielle klassen zu beeinflussen, ist ein einfacher regex-ersetzen erforderlich:</p><pre><code>document.getelementbyid("myelement").classname = document.getelementbyid("myelement").classname.replace ( /(?:^|\s)myclass(?!\s)/g , '' ) /* code wrapped for readability - above is all one statement */ </code></pre><p>eine erklärung dieser regex lautet wie folgt:</p><pre><code>(?:^|\s) # match the start of the string, or any single whitespace character myclass # the literal text for the classname to remove (?!\s) # negative lookahead to verify the above is the whole classname # ensures there is no non-space character following # (i.e. must be end of string or a space) </code></pre><p>das flag <code>g</code> weist das ersetzen an, nach bedarf zu wiederholen, falls der klassenname mehrmals hinzugefügt wurde.</p><h3>so prüfen sie, ob eine klasse bereits auf ein element angewendet wurde:</h3><p>der gleiche reguläre ausdruck, der oben zum entfernen einer klasse verwendet wurde, kann auch zur überprüfung verwendet werden, ob eine bestimmte klasse vorhanden ist:</p><pre><code>if ( document.getelementbyid("myelement").classname.match(/(?:^|\s)myclass(?!\s)/) ) </code></pre><p><br/></p><h3>zuweisen dieser aktionen zu onclick-ereignissen:</h3><p>es ist zwar möglich, javascript direkt in die html-ereignisattribute (z. b. <code>onclick="this.classname+=' myclass'"</code>) zu schreiben, dies wird jedoch nicht empfohlen. insbesondere bei größeren anwendungen wird durch die trennung von html-markup von javascript-interaktionslogik ein wartungsfähigerer code erzielt.</p><p>der erste schritt dazu ist das erstellen einer funktion und das aufrufen der funktion im onclick-attribut. beispiel:</p><pre><code>&lt;script type="text/javascript"&gt; function changeclass(){ // code examples from above } &lt;/script&gt; ... &lt;button onclick="changeclass()"&gt;my button&lt;/button&gt; </code></pre><p><sub><em>(es ist nicht erforderlich, dass dieser code in skript-tags enthalten ist. dies ist lediglich der kürze halber als beispiel gedacht. das einschließen von javascript in eine andere datei ist möglicherweise geeigneter.)</em></sub></p><p>der zweite schritt besteht darin, das onclick-ereignis aus dem html-code in javascript zu verschieben, beispielsweise mit <a href="https://developer.mozilla.org/en-us/docs/dom/element.addeventlistener">addeventlistener</a> </p><pre><code>&lt;script type="text/javascript"&gt; function changeclass(){ // code examples from above } window.onload = function(){ document.getelementbyid("myelement").addeventlistener( 'click', changeclass); } &lt;/script&gt; ... &lt;button id="myelement"&gt;my button&lt;/button&gt; </code></pre><p>(beachten sie, dass der window.onload-teil erforderlich ist, damit der inhalt dieser funktion <em>ausgeführt wird, nachdem der html-code</em> vollständig geladen wurde. andernfalls ist das myelement möglicherweise nicht vorhanden, wenn der javascript-code aufgerufen wird, sodass die zeile fehlschlägt .)</p><p><br/></p><h2>javascript frameworks und bibliotheken</h2><p>der obige code ist alles in standard-javascript enthalten. es ist jedoch üblich, entweder ein framework oder eine bibliothek zu verwenden, um allgemeine aufgaben zu vereinfachen und von behobenen fehlern und edge-fällen zu profitieren, an die sie beim schreiben des codes nicht denken.</p><p>während einige leute es für übertrieben halten, ein ~ 50 kb-framework für das einfache ändern einer klasse hinzuzufügen, ist die überlegung, wenn sie umfangreiche javascript-arbeiten ausführen oder etwas, das ungewöhnliches cross-browser-verhalten hat, eine überlegung wert.</p><p><em>(in groben zügen handelt es sich bei einer bibliothek um eine reihe von werkzeugen, die für eine bestimmte aufgabe entwickelt wurden, während ein framework im allgemeinen mehrere bibliotheken enthält und eine reihe von aufgaben ausführt.)</em></p><p>die obigen beispiele wurden im folgenden mit <a href="http://jquery.com">jquery</a> wiedergegeben, wahrscheinlich der am häufigsten verwendeten javascript-bibliothek (obwohl es auch andere gibt, die es zu untersuchen gilt).</p><p>(beachten sie, dass <code>$</code> hier das jquery-objekt ist.)</p><h3>klassen mit jquery ändern:</h3><pre><code>$('#myelement').addclass('myclass'); $('#myelement').removeclass('myclass'); if ( $('#myelement').hasclass('myclass') ) </code></pre><p>darüber hinaus bietet jquery eine verknüpfung zum hinzufügen einer klasse, wenn sie nicht angewendet wird, oder zum entfernen einer klasse, die folgendes ausführt:</p><pre><code>$('#myelement').toggleclass('myclass'); </code></pre><p><br/></p><h3>zuweisen einer funktion zu einem klickereignis mit jquery:</h3><pre><code>$('#myelement').click(changeclass); </code></pre><p>oder, ohne eine id zu benötigen:</p><pre><code>$(':button:contains(my button)').click(changeclass); </code></pre><p><br/></p> Entweder durch 4 Regeln, wie von GF123 beschrieben, oder als Formel über:  

"Formel zur Ermittlung der zu formatierenden Zellen verwenden" und dann als Formel, für z.B. die Zelle A1:  

=ODER($A$1="a";$A$1="d";$A$1="g";$A$1="j")  

Klappt es? <blockquote> <p>angenommen, der server soll daten mit dem privaten schlüssel verschlüsseln und mit dem öffentlichen schlüssel entschlüsseln, um daten zu verteilen, von denen überprüft werden kann, dass sie vom richtigen server stammen.</p> </blockquote><p>sie können dies tun - auf eine sehr vereinfachte ebene funktioniert die rsa-signatur (anmerkung, vereinfacht - es steckt noch ein bisschen mehr dahinter).</p><blockquote> <p>kann ich den privaten schlüssel einfach veröffentlichen und den öffentlichen schlüssel geheim halten, anstatt den code zu ändern, um dies zu ermöglichen? beeinträchtigt dies die sicherheit des systems?</p> </blockquote><p>sie <strong> müssen den privaten schlüssel überhaupt nicht </strong> veröffentlichen - rsa ist eine trapdoor-permutation, was bedeutet:</p><ul> <li>wenn sie mit einem öffentlichen schlüssel verschlüsseln, können sie mit dem privaten schlüssel entschlüsseln.</li> <li>wenn sie mit einem privaten schlüssel verschlüsseln, können sie mit einem öffentlichen schlüssel entschlüsseln.</li> </ul><p>daher unterstützt rsa sowohl das signieren als auch das verschlüsseln, wobei der endbenutzer nur über den öffentlichen schlüssel verfügt.</p><p>wenn der client in ihrem fall überprüfen möchte, ob daten vom server stammen, wenden sie den zweiten fall von rsa an und entschlüsseln die signaturdaten mit dem bereits vorhandenen öffentlichen schlüssel.</p><p>da es sich um eine permutation handelt, sollten sie ihren code außerdem überhaupt nicht ändern müssen. beide tasten sollten mit derselben funktion arbeiten. ich würde erwarten, dass jede anständige kryptobibliothek apis zur überprüfung von signaturen gemäß den unterschiedlichen standards hat - eine davon wäre wahrscheinlich eine gute wahl.</p><p>rsa labs bieten ein nice <a href="https://web.archive.org/web/20130718172549/https://www.rsa.com/rsalabs/node.asp?id=2182">erklärung hierfür</a> .</p><p>wenn sie dies zwischen servern erweitern oder die clientkommunikation überprüfen möchten, generieren sie schlüssel für jede entität und tauschen sie die öffentlichen aus. das verfahren kann dann an beiden enden angewendet werden.</p><p>theoretisch sind e und d austauschbar (weshalb rsa funktioniert) (man muss als geheim bezeichnet und geheim gehalten werden), aber p und q müssen <strong> immer </strong> sein geheim gehalten, da diese es ihnen ermöglichen, d von e abzuleiten und umgekehrt. sie müssen jedoch beim verständnis des privaten schlüssels äußerst vorsichtig sein - speichert ihre software p/q im privaten schlüssel? wenn ja, können sie es nicht so veröffentlichen, wie es ist. auch wenn ich austauschbar sage - sobald sie eines dieser paare (e oder d zusammen mit ihrem modul n) veröffentlicht haben, müssen sie das andere <em> mit ihrem leben</em> schützen. praktisch gesehen <a href="https://stackoverflow.com/questions/696472/given-a-private-key-is-it-possible-to-derive-its-public-key">wie graeme in den kommentaren verlinkt</a> e wird oft als kleiner/fester wert gewählt. mein kommentar, dass e/d austauschbar ist, trifft eindeutig nicht zu, wenn e leicht zu bestimmen ist. wenn sie so etwas tun, kann dies zu verwirrung und fehlimplementierung führen. verwenden sie eine bibliothek eines drittanbieters/veröffentlichen sie keine privaten schlüssel.</p> <ol> <li> <p>wenn sie als unternehmen verkaufen, schützen sie ihr privatvermögen vor verärgerten kunden, wettbewerbern und allen anderen, die sie ausprobieren möchten</p> </li> <li> <p>der verkauf unter einem firmennamen hilft bei der entwicklung einer marke. richtiger name ist langweilig. überlegen sie sich etwas kreatives und machen sie den namen bekannt.</p> </li> <li> <p>abhängig von ihrem speziellen namen und seiner herkunft haben einige leute möglicherweise bestimmte negative assoziationen oder ideen und entscheiden, dass sie ihren namen einfach nicht mögen, um mit ihnen in irgendeiner weise geschäfte zu machen (geben ihnen möglicherweise nicht nur 0,99 usd oder nehmen sogar ihre app kostenlos). ein firmenname schützt sie vor phobischen menschen.</p> </li> <li> <p>mit einer marke erhalten sie anerkennung für ihre neuen apps. wenn sie eine andere "advanced notes" -app einwerfen, besteht eine gute chance, dass sie unbemerkt bleiben. wenn sie es "coolcomp notes" nennen, wird es ein interesse wecken, wenn ihr name mit großartigen apps verbunden ist.</p> </li> <li> <p>eine marke hilft ihnen dabei, ihre apps einfach und konsistent zu benennen. anstatt zu kämpfen, um einen weiteren namen für ihre nächste app wie "super notes", "personal finances plus" usw. zu erfinden, können sie sie einfach zu "coolcomp notes", "coolcomp finances" machen. viel einfacher und erstellt ein portfolio.</p> </li> <li> <p>eine marke ist später einfacher und zu einem höheren preis zu verkaufen als eine sammlung zufälliger apps von einem typen namens "joshua carmody".</p> </li> </ol> 1. Erstellen Sie eine neue ASP.NET-Webanwendung mit dem Namen "WebProject" mithilfe der Webanwendungsvorlage (Authentifizierung: Benutzerkonto).
2. Fügen Sie der Lösung mit dem Namen "DataAccess" ein weiteres Projekt hinzu (sagen wir Klassenbibliotheksart, obwohl diese nicht relevant ist)
3. Verschieben Sie jetzt den Ordner ApplicationDbContext / ApplicationUser files & migrations in das DataAccess-Projekt.
4. In diesem Stadium wird die Erstellung fehlschlagen, daher müssen wir die project.json für korrekte Referenzen korrigieren.
5. Fügen Sie für DataAccess-Projekt folgende Abhängigkeiten hinzu 


```
"dependencies": {
    "Microsoft.AspNet.Identity.EntityFramework": "3.0.0-rc1-final",
    "EntityFramework.MicrosoftSqlServer": "7.0.0-rc1-final"
}

```
6. Fügen Sie für WebProject `DataAccess` als Abhängigkeit hinzu. Da `DataAccess` auf zwei Pakete verweist, können Sie diese Referenzen aus WebProject entfernen.   
 Build sollte nun erfolgreich sein und Sie können eine Webanwendung starten.

 So verwenden Sie ef-Migrationen: 

 Wechseln Sie in der Befehlszeile in das Verzeichnis von WebProject (und nicht das DataAccess-Projekt). Alle ef-Befehle funktionieren von hier aus gut. 

 Um neue Migrationen zum Migrationsordner des DataAccess-Projekts hinzuzufügen, müssen Sie die Option `-p` verwenden. Mögen,   
 `dnx ef migrations add Sample -p DataAccess` . 

 Das Problem tritt auf, weil die Befehle von cmd im DataAccess-Projekt ausgeführt werden. Ihre Startup-Klasse, die alle Dienste initialisiert, befindet sich in WebProject. Wenn Sie versuchen, Befehle aus dem DataAccess-Verzeichnis auszuführen, wird `dnx ef` erkannt, da auf `EntityFramework.Commands` verwiesen wird. Wenn Sie jedoch versuchen, die Migrationen zu verwenden, werden Dienste nicht initialisiert. Daher wird das Überschreiben der Ausnahme fehlschlagen. Wenn eine Spalte in der Datenbank nullfähig ist, hat die Ergebnisklasse auch eine nullfähige Eigenschaft. 

 Wenn beispielsweise eine `Order` eine `Datetime` Spalte mit dem Namen `CreatedDate` , sieht die resultierende `Order` Klasse in etwa wie folgt aus: 


```
public partial class Order: EntityObject
{
  ...
  private DateTime? _createdDate;
  ...
}

```
  Wenn \_ `createdDate` keinen Wert hat, wenn Sie `ObjectContext.SaveChanges()` aufrufen, wird eine `System.DBNull` automatisch als Teil des Befehls insert oder update an die Datenbank gesendet. 

 Hoffe das hilft Alex hallo und herzlich willkommen in der community, @doppeltupf.das hört sich ja nicht so klasse an. auf welchem gerät treten die schwierigkeiten auf? hast du denn schon unsere tipps entdeckt und ausprobiert?viele grüße, melanie